例如,如果我的句子为$sent = 'how are you';
,并且如果我使用$key = 'ho'
搜索strstr($sent, $key)
,则会返回true
,因为我的句子中有ho
。
我正在寻找的是一种如果我只搜索你是如何,是你还是你的方式返回true。我怎么能这样做?
答案 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的回答,提出了几点建议:
我根据记录的preg_match返回值为比较添加了显式=== 1
$needle = preg_quote($needle);
return preg_match("/\b$needle\b/i", $haystack) === 1;