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

php正则表达式必须包含多个单词,不能包含其他单词,php,regex,Php,Regex,我需要创建一个php正则表达式模式,如果字符串中有一个或多个特定单词,那么该模式将返回true,而其他一些单词则不是 例如,假设我们想允许单词“and”、“this”、“then”;但是不要用“不要”、“担心”和“永远不要”这些词 所以下面的句子应该是匹配的: “我喜欢这种东西” “这个然后” “那么” “我和你” 但以下情况不应出现: “我从不喜欢这种东西” “别担心” “别担心这个和那个” “我从不担心那些事” “我从来没做过什么” 真正的粘滞者不仅是“and”或“and not”运算符的组

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

例如,假设我们想允许单词“and”、“this”、“then”;但是不要用“不要”、“担心”和“永远不要”这些词

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

但以下情况不应出现: “我从不喜欢这种东西” “别担心” “别担心这个和那个” “我从不担心那些事” “我从来没做过什么”

真正的粘滞者不仅是“and”或“and not”运算符的组合,而且单词/字符串可能出现在句子中的任何位置

感谢您的帮助

“And”和“not”在正则表达式中更难实现。使用多个选项可以更轻松地完成

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
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更新了代码。删除了多余的斜杠。

“带很烂”不应该匹配。您可能需要添加
\b
单词边界。否则看起来不错+1是的。当你们评论的时候就想到了!谢谢我添加了边界。这在我的例子中效果不太好,因为我实际上计划填充一个充满regex'的多维数组,然后将一个动态字符串与每个数组键进行比较,以便按需匹配。@user。我懂了。你的问题没有提到这一点,所以我尽量用所提供的信息来回答。由于字数太多,您的问题变得有点困难。这将返回
未知修饰符)
警告。@webbiedave,哪一个是“x”?这只允许空白。如果同时删除所有空格和换行符,则可以删除“x”。它抱怨的是一个括号
未知修饰符'”
但不确定它抱怨的是哪一个。最后一个正则表达式中有一条斜线:
\b/
@webbiedave,这是由于艾伦·摩尔提到的错误
//code>@webbiedave。固定的。