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

PHP regular expressions: match several inclusion / exclusion rules for matches consisting of a complex character set

考虑一组项目。每个项目可能没有分配一个或多个标签。标签名称可以包含除 whitespaces(space、换行符、...)之外的任何有效的 unicode 字符。每个项目的 tag 属性 是一个 space 分隔的标签列表,例如tag1 tag2 tag3.

我目前正在开发一个 PHP 功能,可以过滤所有包含特定标签集的项目,另一方面不允许包含其他标签。

目前,我生成的正则表达式如

/^(?=.*\bfoo\b)(?=.*\bbar\b)(?!.*\bbaz\b).*$/

不在搜索查询中。此表达式匹配包含 foobar baz 的所有 tag 属性。这在标签以 字字符 开头和结尾时非常有效,但在其他情况下停止工作(例如,对于以点或哈希符号开头或结尾的标签)作为 字boundary 锚点仅适用于 word characters.

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

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

我认为你正在生成你的模式,如果是,你可以使用这样的模式:

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

[Regex Demo]

如果不是,您可以简单地获取 \bfoo\b 之外的那些字符,例如 \.\bfoo\b#

一个工作示例:

^(?=.*(?<!\S)foo@(?!\S).*)(?!.*(?<!\S)_bar#(?!\S).*).*

我断言标签前后没有白色-space,而不是单词边界。单词边界是两个环视的组合;在这种情况下,您只想要两者之一(两次)。

  • 标志:g、m
  • 步数:270

Demo