Domanda

Solo bisogno di vedere se un paragrafo contiene una "parola stop", le parole di arresto sono in un array di seguito.

ho avuto la formula come:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan");

    foreach ($pattern_array as $pattern) {
      if (preg_match('/'.$pattern.')/i', $paragraph)) {
        $stopwords = 1;
      }
    }

Il che funziona abbastanza bene, ma per le parole brevi come 'pan' una parola come 'panko' viene identificato come una parola di arresto.

Quindi, l'espressione regolare sarebbe qualcosa di simile deve avere uno spazio prima o essere l'inizio di una nuova linea e due estremità in un full stop / spazio / virgola / (altri oggetti non di caratteri).

Anche come potevo dire php per uscire dal ciclo, non appena una parola di arresto viene identificato?

Grazie ragazzi, rallentando regex imparando come vado!

È stato utile?

Soluzione

Usa \b(preheat|minutes|stir|heat|put|bowl|pan)\b come regex. In questo modo, è necessario solo un espressione regolare (senza looping necessario), e usando la parola \b affermazioni di confine, è assicurarsi che solo le intere parole partita.

Altri suggerimenti

Non ho provato questo, ma \b dovrebbe essere il gruppo di caratteri che stai cercando. Dal rel="nofollow manuale di PHP :

 \b   word boundary

Il tuo codice sarebbe poi simile a questa:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan");

foreach ($pattern_array as $pattern) {
  if (preg_match('/\b'.$pattern.'\b/i', $paragraph)) { // also removed the ')'
    $stopwords = 1;
    break; // to exit the loop
  }
}

Edit: Sembra che le persone sono meglio usare \ b, in modo cambiato questo di conseguenza

è necessario aggiungere \b (che sta per limite di una parola) al vostro regex in questo modo:

'/\b'.$pattern.'\b/i'

Si sembrano avere un errore di battitura nel codice, perché o si dispone di una parentesi di chiusura letterale (e non corrispondono parti delle parole), o si dispone di una parentesi di chiusura aperta.

1. È possibile utilizzare "\ b" per verificare la presenza di confini di parola. Un confine parola è definita come il confine tra un carattere di parola e un carattere non-parola. word-caratteri sono lettere, numeri e underscore.

2 Si può fare tutto in una volta sola, utilizzando "|".

$stopwords = preg_match('/\\b(preheat|minutes|stir|heat|..other words..|pan)\\b/i', $paragraph)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top