たとえば、私の文がであり、それを使用して$sent = 'how are you';
検索すると、私の文が含まれているために返されます。$key = 'ho'
strstr($sent, $key)
true
ho
私が探しているのは、私がどのように、あるか、またはあなただけを検索した場合にtrueを返す方法です。これどうやってするの?
単語境界のある正規表現を使用する関数preg-match
を使用できます。
if(preg_match('/\byou\b/', $input)) {
echo $input.' has the word you';
}
同じ文字列内の複数の単語をチェックする必要があり、大きな文字列を処理している場合、これはより高速です。
$text = explode(' ',$text);
$text = array_flip($text);
次に、次の単語を確認できます。
if (isset($text[$word])) doSomething();
この方法は非常に高速です。
ただし、短い文字列のいくつかの単語をチェックするには、preg_matchを使用します。
アップデート:
実際にこれを使用する場合は、問題を回避するために次のように実装することをお勧めします。
$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();
その場合、ダブルスペース、改行、句読点、大文字はフォールスネガティブを生成しません。
この方法は、大きな文字列(つまり、テキストのドキュメント全体)内の複数の単語をチェックする場合にはるかに高速ですが、通常のサイズの文字列に1つの単語が存在するかどうかを確認するだけの場合は、preg_matchを使用する方が効率的です。
できることの1つは、文をスペースで配列に分割することです。
まず、不要な句読点を削除する必要があります。次のコードは、文字、数字、またはスペース以外のものをすべて削除します。
$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent);
これで、スペースで区切られた単語だけが表示されます。スペースで分割する配列を作成するには...
$sent_split = explode(" ", $sent);
最後に、チェックを行うことができます。これがすべてのステップを組み合わせたものです。
// 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'
@codaddictの答えは技術的には正しいですが、検索している単語がユーザーによって提供されている場合は、検索単語で特別な正規表現の意味を持つ文字をエスケープする必要があります。例えば:
$searchWord = $_GET['search'];
$searchWord = preg_quote($searchWord);
if (preg_match("/\b$searchWord\b", $input) {
echo "$input has the word $searchWord";
}
アビの答えを認めて、いくつかの提案:
文書化されたpreg_matchの戻り値に基づいて、明示的な===1を比較に追加しました
$needle = preg_quote($needle);
return preg_match("/\b$needle\b/i", $haystack) === 1;