如何检查句子中是否存在单词

时间:2011-11-10 04:49:00

标签: php search strstr

例如,如果我的句子为$sent = 'how are you';,并且如果我使用$key = 'ho'搜索strstr($sent, $key),则会返回true,因为我的句子中有ho

我正在寻找的是一种如果我只搜索你是如何,是你还是你的方式返回true。我怎么能这样做?

5 个答案:

答案 0 :(得分:7)

您可以使用使用regex with word boundaries的函数preg-match

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

答案 1 :(得分: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();

然后双倍空格,换行符,标点符号和大写字母不会产生错误否定。

这种方法在检查大字符串中的多个单词(即整个文本文档)时要快得多,但如果你想要做的就是查找正常大小字符串中是否存在单个单词,那么使用preg_match会更有效率

答案 2 :(得分:3)

您可以做的一件事就是将空格分成一个数组。

首先,您需要删除任何不需要的标点符号。 以下代码删除任何不是字母,数字或空格的内容:

$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'

答案 3 :(得分:1)

@ codaddict的答案在技术上是正确的,但如果您搜索的单词是由用户提供的,则您需要在搜索词中转义任何具有特殊正则表达式的字符。例如:

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

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

答案 4 :(得分:0)

承认Abhi的回答,提出了几点建议:

  1. 我添加了/ i到正则表达式,因为句子词可能不区分大小写
  2. 我根据记录的preg_match返回值为比较添加了显式=== 1

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