2011-11-10 23 views
5

Por ejemplo, si yo juzgo $sent = 'how are you'; y si busco $key = 'ho' usando strstr($sent, $key) volverá true porque mi frase tiene ho en ella.¿Cómo comprobar si existe una palabra en una frase

Lo que estoy buscando es una forma de devolver la verdad si solo busco cómo, somos o usted. ¿Cómo puedo hacer esto?

Respuesta

6

Si desea comprobar si hay varias palabras en la misma cadena, y que está tratando con grandes cadenas, entonces esto es más rápido:

$text = explode(' ',$text); 
$text = array_flip($text); 

A continuación, puede comprobar palabras con:

if (isset($text[$word])) doSomething(); 

Este método es muy rápido.

Pero para buscar un par de palabras en cadenas cortas, utilice preg_match.

ACTUALIZACIÓN:

Si realmente vas a utilizar este sugiero ponerlo en práctica como esta para evitar problemas:

$text = preg_replace('/[^a-z\s]/', '', strtolower($text)); 
$text = preg_split('/\s+/', $text, NULL, PREG_SPLIT_NO_EMPTY); 
$text = array_flip($text); 

$word = strtolower($word); 
if (isset($text[$word])) doSomething(); 

Entonces doble espacios, saltos de línea, puntuacion y capitales ganaron' t produce falsos negativos.

Este método es mucho más rápido para buscar múltiples palabras en cadenas grandes (es decir, documentos enteros de texto), pero es más eficiente usar preg_match si todo lo que quiere hacer es encontrar si existe una sola palabra en un tamaño normal cuerda.

+0

Lo probé y funcionó. Muchas gracias. – Tafu

+0

Si vas a usar esto, mira mi actualización para hacerlo más confiable. – Alasdair

1

@ respuesta de codaddict es técnicamente correcto, pero si la palabra que está buscando es proporcionada por el usuario, lo que necesita para escapar de cualquier carácter, con especial significado de expresión regular en la palabra de búsqueda. Por ejemplo:

$searchWord = $_GET['search']; 
$searchWord = preg_quote($searchWord); 

if (preg_match("/\b$searchWord\b", $input) { 
    echo "$input has the word $searchWord"; 
} 
+0

Ya, la palabra buscada es provista por un usuario. Gracias por la visión de usted. – Tafu

+0

El paréntesis de cierre falta para ** si **. –

3

Una cosa que puede hacer es dividir su oración por espacios en una matriz.

En primer lugar, debe eliminar los signos de puntuación no deseados. El siguiente código elimina cualquier cosa que no sea una letra, número o espacio:

$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent); 

Ahora, todo lo que tienes son las palabras, separadas por espacios. Para crear una matriz que se divida por espacio ...

$sent_split = explode(" ", $sent); 

Finalmente, puede hacer su verificación. Aquí están todos los pasos combinados.

// The information you give 
$sent = 'how are you'; 
$key = 'ho'; 

// Isolate only words and spaces 
$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent); 
$sent_split = explode(" ", $sent); 

// Do the check 
if (in_array($key, $sent)) 
{ 
    echo "Word found"; 
} 
else 
{ 
    echo "Word not found"; 
} 

// Outputs: Word not found 
// because 'ho' isn't a word in 'how are you' 
0

Con el reconocimiento a la respuesta de Abhi, un par de sugerencias:

  1. añadí/i para la expresión regular desde frases-palabras son probablemente tratados mayúsculas y minúsculas
  2. añadí explícita == = 1 para la comparación basada en el retorno preg_match documentado valores

    $needle = preg_quote($needle); 
    return preg_match("/\b$needle\b/i", $haystack) === 1; 
    
Cuestiones relacionadas