2011-11-10 24 views
5

Per esempio, se la mia frase è $sent = 'how are you'; e se cerco $key = 'ho' usando strstr($sent, $key) tornerà true perché la mia frase ha ho in esso.Come controllare se una parola esiste in una frase

Quello che sto cercando è un modo per restituire vero se cerco solo come, o o. Come posso fare questo?

risposta

6

Se si desidera verificare la presenza di più parole la stessa stringa, e hai a che fare con stringhe di grandi dimensioni, allora questo è più veloce:

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

Quindi è possibile verificare la presenza di parole con:

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

Questo metodo è velocissimo.

Ma per verificare un paio di parole in stringhe brevi, utilizzare preg_match.

UPDATE:

Se si sta effettivamente andando a utilizzare questo vi consiglio di implementare in questo modo per evitare problemi:

$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(); 

Poi doppio spazi, interruzioni di linea, punteggiatura e maiuscole vinto' t produrre falsi negativi.

Questo metodo è molto più veloce nel controllo di più parole in grandi stringhe (cioè interi documenti di testo), ma è più efficiente usare preg_match se tutto ciò che si vuole fare è trovare se esiste una singola parola in una dimensione normale stringa.

+0

L'ho provato e ha funzionato. Grazie mille. – Tafu

+0

Se hai intenzione di usarlo, consulta il mio aggiornamento per renderlo più affidabile. – Alasdair

6

È possibile utilizzare la funzione preg-match che utilizza un regex with word boundaries:

if(preg_match('/\byou\b/', $input)) { 
    echo $input.' has the word you'; 
} 
1

@ risposta di codaddict è tecnicamente corretto, ma se la parola che si sta cercando è fornito dall'utente, è necessario sfuggire alcun carattere con particolare espressione regolare che significa nella parola di ricerca. Per esempio:

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

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

Ya, la parola cercata viene fornita da un utente. Grazie per l'intuizione. – Tafu

+0

Manca la parentesi chiusa per il ** if **. –

3

Una cosa che puoi fare è scomporre la tua frase per spazi in un array.

In primo luogo, è necessario rimuovere eventuali segni di punteggiatura indesiderati. Il codice seguente rimuove tutto ciò che non è una lettera, un numero o spazio:

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

Ora, tutto ciò che dovete sono le parole, separate da spazi. Per creare un array che divide dallo spazio ...

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

Infine, si può fare il vostro controllo. Ecco tutti i passaggi combinati.

// 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 il riconoscimento alla risposta di Abhi, un paio di suggerimenti:

  1. ho aggiunto/i per l'espressione regolare in quanto frase-parole sono probabilmente trattati caso insensibile
  2. ho aggiunto esplicito == = 1 per il confronto basato sul ritorno preg_match documentato valori

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