php - extraer - Usando una matriz como agujas en Strpos
strstr php (14)
@Dave un fragmento actualizado de http://www.php.net/manual/en/function.strpos.php#107351
function strposa($haystack, $needles=array(), $offset=0) {
$chr = array();
foreach($needles as $needle) {
$res = strpos($haystack, $needle, $offset);
if ($res !== false) $chr[$needle] = $res;
}
if(empty($chr)) return false;
return min($chr);
}
Cómo utilizar:
$string = ''Whis string contains word "cheese" and "tea".'';
$array = array(''burger'', ''melon'', ''cheese'', ''milk'');
if (strposa($string, $array, 1)) {
echo ''true'';
} else {
echo ''false'';
}
volverá true
, debido a la array
"cheese"
.
Actualización: Código mejorado con parada cuando se encuentra la primera de las agujas:
function strposa($haystack, $needle, $offset=0) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $query) {
if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
}
return false;
}
$string = ''Whis string contains word "cheese" and "tea".'';
$array = array(''burger'', ''melon'', ''cheese'', ''milk'');
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found
¿Cómo se usan los strpos
para una variedad de agujas cuando se busca una cadena? Por ejemplo:
$find_letters = array(''a'', ''c'', ''d'');
$string = ''abcdefg'';
if(strpos($string, $find_letters) !== false)
{
echo ''All the letters are found in the string!'';
}
Porque al usar esto, no funcionaría, sería bueno si hubiera algo como esto
Con el siguiente código:
$flag = true;
foreach($find_letters as $letter)
if(false===strpos($string, $letter)) {
$flag = false;
break;
}
Luego verifica el valor de $flag
. Si es true
, todas las letras han sido encontradas. Si no, es false
.
El siguiente código no solo muestra cómo hacerlo, sino que también lo coloca en una función fácil de usar en el futuro. Fue escrito por "jesda". (Lo encontré en línea)
Código PHP:
<?php
/* strpos that takes an array of values to match against a string
* note the stupid argument order (to match strpos)
*/
function strpos_arr($haystack, $needle) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $what) {
if(($pos = strpos($haystack, $what))!==false) return $pos;
}
return false;
}
?>
Uso:
$needle = array(''something'',''nothing'');
$haystack = "This is something";
echo strpos_arr($haystack, $needle); // Will echo True
$haystack = "This isn''t anything";
echo strpos_arr($haystack, $needle); // Will echo False
Esta expresión busca todas las letras:
count(array_filter(
array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
Este es mi enfoque. Itera sobre los caracteres en la cadena hasta que se encuentre una coincidencia. En una matriz más grande de agujas, esto superará la respuesta aceptada, ya que no es necesario verificar cada aguja para determinar si se ha encontrado una coincidencia.
function strpos_array($haystack, $needles = [], $offset = 0) {
for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
if (in_array($haystack[$i],$needles)) {
return $i;
}
}
return false;
}
Es muy simple y eficiente. Comparaté esto con la respuesta aceptada y con una matriz de 7 $needles
las dos funciones eran casi iguales. Menos de 7 la respuesta aceptada superó a la mía, pero más de 7 fue dramáticamente más rápida.
Estoy escribiendo una nueva respuesta que espero ayude a cualquiera que busque algo similar a lo que soy.
Esto funciona en el caso de "Tengo varias agujas y estoy tratando de usarlas para encontrar una cuerda individualizada". y esta es la pregunta que encontré para encontrar eso.
$i = 0;
$found = array();
while ($i < count($needle)) {
$x = 0;
while ($x < count($haystack)) {
if (strpos($haystack[$x], $needle[$i]) !== false) {
array_push($found, $haystack[$x]);
}
$x++;
}
$i++;
}
$found = array_count_values($found);
La matriz $found
contendrá una lista de todas las agujas que coincidan, el elemento de la matriz con el valor de conteo más alto será la (s) cadena (s) que está buscando, puede obtenerlo con:
print_r(array_search(max($found), $found));
La pregunta, ¿el ejemplo proporcionado es solo un "ejemplo" o es exactamente lo que estás buscando? Aquí hay muchas respuestas variadas, y no entiendo la complejidad del aceptado.
Para saber si CUALQUIER contenido de la matriz de agujas existe en la cadena, y rápidamente devuelve verdadero o falso:
$string = ''abcdefg'';
if(str_replace(array(''a'', ''c'', ''d''), '''', $string) != $string){
echo ''at least one of the needles where found'';
};
Si, entonces, por favor, crédito a por eso.
Para saber si TODOS los valores de la matriz de agujas existen en la cadena, como en este caso, los tres ''a'', ''b''
y ''c''
DEBEN estar presentes, como usted menciona como su "por ejemplo"
echo ''¡Todas las letras se encuentran en la cadena!'';
Muchas respuestas aquí están fuera de ese contexto, pero dudo que la intensión de la pregunta como marcó como resuelta. Ej. La respuesta aceptada es una aguja de
$array = array(''burger'', ''melon'', ''cheese'', ''milk'');
¿Qué pasa si todas esas palabras DEBEN encontrarse en la cadena?
Luego prueba algunas "not accepted answers"
en esta página.
Puede iterar a través de la matriz y establecer un valor de " strpos
" si strpos
devuelve false
.
$flag = false;
foreach ($find_letters as $letter)
{
if (strpos($string, $letter) === false)
{
$flag = true;
}
}
Luego verifica el valor de $flag
.
Puedes intentar esto:
function in_array_strpos($word, $array){
foreach($array as $a){
if (strpos($word,$a) !== false) {
return true;
}
}
return false;
}
Responda a @binyamin y @Timo ... (no hay suficientes puntos para agregar un comentario ...) pero el resultado no contiene la posición ...
El siguiente código devolverá la posición real del primer elemento, que es lo que pretende hacer Strpos. Esto es útil si esperas encontrar exactamente 1 coincidencia. Si esperas encontrar varias coincidencias, la posición del primero encontrado puede no tener sentido.
function strposa($haystack, $needle, $offset=0) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $query) {
$res=strpos($haystack, $query, $offset);
if($res !== false) return $res; // stop on first true result
}
return false;
}
Si solo quieres comprobar si ciertos caracteres están realmente en la cadena o no, usa strtok :
$string = ''abcdefg'';
if (strtok($string, ''acd'') === $string) {
// not found
} else {
// found
}
Solo una actualización de las respuestas anteriores
function strsearch($findme, $source){
if(is_array($findme)){
if(str_replace($findme, '''', $source) != $source){
return true;
}
}else{
if(strpos($source,$findme)){
return true;
}
}
return false;
}
También puede intentar usar strpbrk() para la negación (no se ha encontrado ninguna de las letras):
$find_letters = array(''a'', ''c'', ''d'');
$string = ''abcdefg'';
if(strpbrk($string, implode($find_letters)) === false)
{
echo ''None of these letters are found in the string!'';
}
str_replace es considerablemente más rápido.
$find_letters = array(''a'', ''c'', ''d'');
$string = ''abcdefg'';
$match = (str_replace($find_letters, '''', $string) != $string);