我要做的是检查字符串中是否存在某些关键字。匹配单个单词不是问题,但是如果例如需要匹配两个单词,我无法弄清楚如何使其工作。
这是我到目前为止所得到的
$filter = array('single','bar');
$text = 'This is the string that needs to be checked, with single and mutliple words';
$matches = array();
$regexp = "/\b(" . implode($filter,"|") . ")\b/i";
$matchFound = preg_match_all(
$regexp,
$text,
$matches
);
if ($matchFound) {
foreach($matches[0] as $match) {
echo $match . "\n";
}
}
问题在于,如果string
和checked
匹配,我不知道如何创建一个返回true的正则表达式。如果我需要使用两个不是问题的表达式。
作为一个逻辑陈述,它将是这样的:single || bar || (string && checked)
答案 0 :(得分:1)
如果要检查所有单词的出现,使用变量作为标志就足够了(并且单独检查每个单词),而不是一个大的正则表达式。
$filter = array('single','bar');
$foundAll = true;
foreach ($filter as $searchFor) {
$pattern = "/\b(" . $searchFor . ")\b/i";
if (!preg_match($pattern, $string)) {
$foundAll = false;
break;
}
}
答案 1 :(得分:1)
如果您确实想使用正则表达式执行此操作,可以使用:
$regex = "";
foreach ($filter as $word) {
$regex .= "(?=.*\b".$word."\b)";
}
$regex = "/".$regex."^.*$/i";
对于single
和bar
这些词,正则表达式为:/(?=.*\bsingle\b)(?=.*\bbar\b)^.*$
你不需要遍历匹配,因为这只匹配一次,匹配将是整个字符串(假设所有单词都存在)。
$matchFound = preg_match($regex, $text);
print($matchFound); // 0 for "single","bar". 1 for "single","checked"
答案 2 :(得分:0)
维护您的实际代码,可以探索,检查数组是否与array_diff
具有相同的值:
$filter = array('single','bar');
$text = 'This is the string that needs to be checked, with single and mutliple words';
$regexp = "/\b(" . implode($filter,"|") . ")\b/i";
$matchFound = preg_match_all($regexp, $text, $matches);
$matchFound = !!array_diff($filter, $matches[1]); //<- false if no diffs
if ($matchFound) {
...
如果没有差异, !!array_diff
会返回false,这意味着$filter
$text
的所有键