もう一つのトリッキーな preg_match
-
13-09-2019 - |
質問
段落に「ストップワード」が含まれているかどうかを確認する必要があるだけです。ストップワードは以下の配列にあります。
次のような式がありました。
$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan");
foreach ($pattern_array as $pattern) {
if (preg_match('/'.$pattern.')/i', $paragraph)) {
$stopwords = 1;
}
}
これでも十分機能しますが、「pan」のような短い単語の場合、「panko」のような単語はストップワードとして識別されます。
したがって、正規表現は、その前にスペースがあるか、新しい行の始まりであり、ピリオド/スペース/カンマ/(その他の非文字オブジェクト)で終わる必要があるようなものになります。
また、ストップワードが識別されたらすぐにループを終了するようにphpに指示するにはどうすればよいでしょうか?
皆さん、ありがとうございます。正規表現の学習が遅くなりました。
解決
使用 \b(preheat|minutes|stir|heat|put|bowl|pan)\b
正規表現として。そうすれば、正規表現が 1 つだけ必要になります (ループは必要ありません)。 \b
単語境界アサーションでは、単語全体のみが一致することを確認します。
他のヒント
これは試していませんが、 \b
探している文字グループである必要があります。から PHPマニュアル:
\b word boundary
コードは次のようになります。
$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
}
}
編集:\b を使用する方が良いようですので、それに応じてこれを変更しました
追加する必要があります \b
(単語の境界を表します)を正規表現に次のように入力します。
'/\b'.$pattern.'\b/i'
リテラルの閉じ括弧がある (単語の一部と一致しない) か、開いた閉じ括弧があるため、コードにタイプミスがあるようです。
1. 「\b」を使用して単語の境界を確認できます。単語境界は、単語文字と非単語文字の間の境界として定義されます。単語文字は、文字、数字、アンダースコアです。
2. 「|」を使用すると、すべてを一度に行うことができます。
$stopwords = preg_match('/\\b(preheat|minutes|stir|heat|..other words..|pan)\\b/i', $paragraph)