我需要创建一个php正则表达式模式,如果字符串中有一个或多个特定单词,则会返回true,但其他一些单词不是。
例如,假设我们想要允许单词'and','this','then';但后来不允许用词“不要”,“担心”和“从不”。
所以下面的句子应该匹配: “我喜欢这个东西” “这个然后” “那就是” “我和你”
但以下不应该: “我从不喜欢这个东西” “别担心它” “别担心这个和那个” “我从不担心那些东西” “我从不做某事”
真正的粘合剂不仅仅是'和''或''而不是'运算符的组合,还有单词/字符串可以出现在句子中的任何位置。
感谢您的帮助
答案 0 :(得分:5)
function isAllowedSentence($str)
{
return (preg_match('/\b(and|this|then)\b/i', $str) && !preg_match('/\b(don\'t|worry|never)\b/i', $str));
}
echo isAllowedSentence('I like this stuff'); // true
echo isAllowedSentence('I never like this stuff'); // false
echo isAllowedSentence('I like Johnny Mathis'); // false
答案 1 :(得分:2)
“和”和“不”与正则表达式相比更难。使用多个
可以更容易preg_match('/\b(?:and|this|then)\b/i', $str)
&&
!preg_match('/\b(?:dont|worry|never)\b/i', $str)
但是可以做到。
首先,否定:
preg_match('/\b(?:and|this|then)\b/i', $str)
&&
!preg_match('/^(?: (?!\b(?:dont|worry|never)\b). )*\z/isx', $str)
然后合并它们:
preg_match(
'/
^
(?= .* \b(?:and|this|then)\b )
(?= (?: (?!\b(?:dont|worry|never)\b). )*\z )
/isx',
$str
)
这适用于Perl。未在PHP中测试过。
更新:PHP-ified代码。删除了杂乱的斜线。