5

たとえば、私の文がであり、それを使用して$sent = 'how are you';検索すると、私の文が含まれているために返されます。$key = 'ho'strstr($sent, $key)trueho

私が探しているのは、私がどのように、あるか、またはあなただけを検索した場合にtrueを返す方法です。これどうやってするの?

4

5 に答える 5

8

単語境界のある正規表現を使用する関数preg-matchを使用できます。

if(preg_match('/\byou\b/', $input)) {
  echo $input.' has the word you';
}
于 2011-11-10T04:50:40.110 に答える
6

同じ文字列内の複数の単語をチェックする必要があり、大きな文字列を処理している場合、これはより高速です。

$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を使用する方が効率的です。

于 2011-11-10T04:57:31.980 に答える
3

できることの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'
于 2011-11-10T05:03:03.523 に答える
1

@codaddictの答えは技術的には正しいですが、検索している単語がユーザーによって提供されている場合は、検索単語で特別な正規表現の意味を持つ文字をエスケープする必要があります。例えば:

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

if (preg_match("/\b$searchWord\b", $input) {
  echo "$input has the word $searchWord";
}
于 2011-11-10T04:55:12.050 に答える
0

アビの答えを認めて、いくつかの提案:

  1. 文の単語はおそらく大文字と小文字を区別せずに扱われるため、正規表現に/iを追加しました
  2. 文書化されたpreg_matchの戻り値に基づいて、明示的な===1を比較に追加しました

    $needle = preg_quote($needle);
    return preg_match("/\b$needle\b/i", $haystack) === 1;
    
于 2012-12-17T10:23:14.113 に答える