我正在尝试在php中创建一个单词过滤器,并且我遇到了之前的Stackoverlow帖子,它提到了以下内容以检查字符串是否包含某些单词。我想做的就是调整它,以便一次检查各种不同的单词,而不必一遍又一遍地重复代码。
$a = 'How are you ?';
if (strpos($a,'are') !== false) {
echo 'true';
}
如果我将代码修改为以下内容,它会起作用吗?......
$a = 'How are you ?';
if (strpos($a,'are' OR $a,'you' OR $a,'How') !== false) {
echo 'true';
}
添加多个单词以检查的正确方法是什么?。
答案 0 :(得分:6)
要扩展当前代码,您可以使用目标字词数组进行搜索,并使用循环:
$a = 'How are you ?';
$targets = array('How', 'are');
foreach($targets as $t)
{
if (strpos($a,$t) !== false) {
echo 'one of the targets was found';
break;
}
}
请记住,以这种方式使用strpos()
意味着可以找到部分单词匹配。例如,如果字符串ample
中的目标为here is an example
,则即使根据定义,单词ample
不存在,也会找到匹配项。
对于整个单词匹配,preg_match()
文档中有一个示例可以通过为多个目标添加循环来扩展:
foreach($targets as $t)
{
if (preg_match("/\b" . $t . "\b/i", $a)) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
}
答案 1 :(得分:4)
在某处阅读:
if(preg_match('[word1|word2]', $a)) { }
答案 2 :(得分:1)
如果你有一个固定数量的单词,这个单词不是很大,你可以很容易地做到这样:
$a = 'How are you ?';
if (strpos($a,'are') !== false || strpos($a,'you') !== false || strpos($a,'How') !== false) {
echo 'true';
}
答案 3 :(得分:1)
if (strpos($ro1['title'], $search)!==false or strpos($ro1['description'], $search)!== false or strpos($udetails['user_username'], $search)!== false)
{
//excute ur code
}
答案 4 :(得分:0)
我使用 str_contains
和 preg_match
构建方法来比较速度。
public static function containsMulti(?string $haystackStr, array $needlesArr): bool
{
if ($haystackStr && $needlesArr) {
foreach ($needlesArr as $needleStr) {
if (str_contains($haystackStr, $needleStr)) {
return true;
}
}
}
return false;
}
preg_match 总是慢很多(慢 2-10 倍,取决于几个因素),但如果你想扩展它以进行全字匹配等,可能会很有用。
public static function containsMulti(?string $haystackStr, array $needlesArr): bool
{
if ($haystackStr && $needlesArr) {
$needlesRegexStr = implode('|', array_map('preg_quote', $needlesArr));
return (bool) preg_match('/(' . $needlesRegexStr . ')/', $haystackStr);
}
return false;
}