PHP正则表达式:为由复杂字符集组成的匹配匹配匹配多个包含/排除规则

PHP正则表达式:为由复杂字符集组成的匹配匹配匹配多个包含/排除规则,php,regex,pcre,Php,Regex,Pcre,考虑一组项目。每个项目可能没有、一个或多个标记。标记名可以由除空格(空格、换行符等)以外的任何有效unicode字符组成。每个项目的tag属性是一个以空格分隔的标记列表,例如tag1 tag2 tag3 我目前正在开发一个PHP函数,该函数可以过滤那些确实包含一组特定标记的所有项,另一方面,不允许包含其他一些项 目前,我生成了一个正则表达式,如 /^(?=.*\bfoo\b)(?=.*\bbar\b)(?!.*\bbaz\b).*$/ 退出搜索查询。此表达式匹配所有包含foo和bar但不包含b

考虑一组项目。每个项目可能没有、一个或多个标记。标记名可以由除空格(空格、换行符等)以外的任何有效unicode字符组成。每个项目的
tag
属性是一个以空格分隔的标记列表,例如
tag1 tag2 tag3

我目前正在开发一个PHP函数,该函数可以过滤那些确实包含一组特定标记的所有项,另一方面,不允许包含其他一些项

目前,我生成了一个正则表达式,如

/^(?=.*\bfoo\b)(?=.*\bbar\b)(?!.*\bbaz\b).*$/
退出搜索查询。此表达式匹配所有包含
foo
bar
不包含
baz
tag
属性。当标记以单词字符开头和结尾时,这一点非常有效,但在其他情况下(例如,对于以点或哈希符号开头或结尾的标记),则停止工作,因为单词边界锚点仅适用于单词字符

你知道我如何修改像
.foo#
这样的标签的正则表达式吗


该解决方案应在PHP 5.5+上受支持。

我认为您正在生成模式,如果是,您可以使用如下模式:

/^(?=.*(\W|^)foo(\W|$))(?=.*(\W|^)bar(\W|$))(?!.*(\W|^)baz(\W|$)).*$/

如果没有,您只需将那些字符置于
\bfoo\b
之外,如
\.\bfoo\b

一个工作示例:

^(?=.*

我没有使用单词边界,而是声明标记前后没有空格。单词边界是两个lookaround的组合;在本例中,您只需要其中一个(两次)

  • 国旗:g,m
  • 步骤:270

应该
.foo#
匹配
…foo#.%
abc.foo#def
(空格).foo#