php正则表达式必须包含几个单词,不得包含其他单词

时间:2011-04-27 03:05:24

标签: php regex

我需要创建一个php正则表达式模式,如果字符串中有一个或多个特定单词,则会返回true,但其他一些单词不是。

例如,假设我们想要允许单词'and','this','then';但后来不允许用词“不要”,“担心”和“从不”。

所以下面的句子应该匹配: “我喜欢这个东西” “这个然后” “那就是” “我和你”

但以下不应该: “我从不喜欢这个东西” “别担心它” “别担心这个和那个” “我从不担心那些东西” “我从不做某事”

真正的粘合剂不仅仅是'和''或''而不是'运算符的组合,还有单词/字符串可以出现在句子中的任何位置。

感谢您的帮助

2 个答案:

答案 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代码。删除了杂乱的斜线。