2010-01-23 15 views
19

¿Cómo puedo verificar si un $string contiene alguno de los elementos expresados ​​en una matriz?La cadena contiene elementos en una matriz (no distingue entre mayúsculas y minúsculas)

$string = 'My nAmE is Tom.'; 
$array = array("name","tom"); 
if(contains($string,$array)) 
{ 
// do something to say it contains 
} 

¿Alguna idea?

+0

Comprobación Solución publicada en [php compruebe si string contiene un valor en la matriz] (http://stackoverflow.com/a/40543118/4243217) – jitendrapurohit

Respuesta

11

es eso lo que querías? Espero que ese código compila :)

$string = 'My nAmE is Tom.'; 
$array = array("name","tom"); 
if(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array))) 
{ 
    //do sth 
} 
+0

esto parece funcionar mejor entre todos :) – tarnfeld

+14

Esto fallaría en las cuerdas: "Tom, ¿qué piensas?" "Su nombre es Tom." Entre muchos otros. – hobodave

0

¿Esto hará el trabajo?

$words = explode(" ", $string); 
$wordsInArray = array(); 
foreach($words as $word) { 
    if(in_array($word, $array)) { 
     $wordsInArray[] = $word; 
    } 
} 
+0

Esto solo coincide con palabras completas. – apokryfos

74

No creo que haya una función incorporada que pueda manejar lo que usted desee. Desde aquí se puede escribir una función sin embargo:

function contains($str, array $arr) 
{ 
    foreach($arr as $a) { 
     if (stripos($str,$a) !== false) return true; 
    } 
    return false; 
} 
+29

+1 por no ser ridículamente complejo, usar expresiones regulares o tratar de ajustarlo todo en una sola línea. – hobodave

+4

¿Por qué no regexp? Creo que no es difícil interpretar preg_match ('/'. Implode ('|', $ arr). '/ I', $ str) – velop

+0

Agradable y simple @velop :) Me pregunto cuál es más eficiente. – Jammer

3

Algo como esto funcionaría:

$string = 'My nAmE is Tom.'; 
$array = array("name", "tom"); 
foreach ($array as $token) { 
    if (stristr($string, $token) !== FALSE) { 
     print "String contains: $token\n"; 
    } 
} 
0
function contains($str, $arr) 
{ 
    $ptn = ''; 
    foreach ($arr as $s) { 
    if ($ptn != '') $ptn .= '|'; 
    $ptn .= preg_quote($s, '/'); 
    } 
    return preg_match("/$ptn/i", $str); 
} 

echo contains('My nAmE is Tom', array('name', 'tom')); 
-3

Mucho más simple, consulte el enlace in_array

$os = array("Mac", "NT", "Irix", "Linux"); 
if (in_array("Irix", $os)) { 
echo "Es Irix"; 
} 
+5

Uh, excepto que está tratando de encontrar subcadenas específicas -en una oración-. – Kzqai

+0

Estás buscando una coincidencia exacta con 'in_array', no es una respuesta correcta. – nikoskip

10

Utilizando el aceptados respuesta:

$string = 'My nAmE is Tom.'; 
$array = array("name","tom"); 
if(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array))) 
{ 
    //do sth 
} 

Sólo una nota que la sentencia if se podría cambiar a:

if(0 < count(array_intersect(explode(' ', strtolower($string)), $array))) 

ya que en realidad no es necesario el uso de array_map aplicar strtolower a cada elemento. en su lugar, aplicarlo a la cadena inicial.

+0

+1 para hacer algunas mejoras para mi código de 3 años ;-) – sbczk

+0

gracias. mi primera publicación aquí, en realidad. un chico tiene que empezar en algún lugar, ¿verdad? ;) – kkonstantinov

+0

Esto (junto con la respuesta aceptada) coincide con palabras completas en lugar de subcadenas, por lo que si necesita hacer coincidir más palabras completas, probablemente debería utilizar la respuesta de @zombat. – apokryfos

6

Uno más para la solución contiene la función

function contains($string, $array, $caseSensitive = true) 
{ 
    $stripedString = $caseSensitive ? str_replace($array, '', $string) : str_ireplace($array, '', $string); 
    return strlen($stripedString) !== strlen($string); 
} 

PS. En cuanto a mí, yo sólo lo uso sin función ..

if (strlen(str_replace($array, '', $string)) !== strlen($string)) { 
    // do it 
} 
+0

Me gusta esta solución :) – Joel

1
<?php 

$input = preg_quote('blu', '~'); // don't forget to quote input string! 
$data = array('orange', 'blue', 'green', 'red', 'pink', 'brown', 'black'); 

$result = preg_grep('~' . $input . '~', $data); 
print_r($result); 

?> 
0

Otra manera de hacerlo con la función array_intersect(), pruebe a continuación código:

function checkString(array $arr, $str) { 

    $str = preg_replace(array('/[^ \w]+/', '/\s+/'), ' ', strtolower($str)); // Remove Special Characters and extra spaces -or- convert to LowerCase 

    $matchedString = array_intersect(explode(' ', $str), $arr); 

    if (count($matchedString) > 0) { 
    return true; 
    } 
    return false; 
} 
Cuestiones relacionadas