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).*$/
不在搜索查询中。此表达式匹配包含 foo
和 bar
但 不 baz
的所有 tag
属性。这在标签以 字字符 开头和结尾时非常有效,但在其他情况下停止工作(例如,对于以点或哈希符号开头或结尾的标签)作为 字boundary 锚点仅适用于 word characters.
你知道我如何修改像 .foo#
这样的标签的正则表达式吗?
PHP 5.5+ 应支持该解决方案。
我认为你正在生成你的模式,如果是,你可以使用这样的模式:
/^(?=.*(\W|^)foo(\W|$))(?=.*(\W|^)bar(\W|$))(?!.*(\W|^)baz(\W|$)).*$/
如果不是,您可以简单地获取 \bfoo\b
之外的那些字符,例如 \.\bfoo\b#
。
一个工作示例:
^(?=.*(?<!\S)foo@(?!\S).*)(?!.*(?<!\S)_bar#(?!\S).*).*
我断言标签前后没有白色-space,而不是单词边界。单词边界是两个环视的组合;在这种情况下,您只想要两者之一(两次)。
- 标志:g、m
- 步数:270
考虑一组项目。每个项目可能没有分配一个或多个标签。标签名称可以包含除 whitespaces(space、换行符、...)之外的任何有效的 unicode 字符。每个项目的 tag
属性 是一个 space 分隔的标签列表,例如tag1 tag2 tag3
.
我目前正在开发一个 PHP 功能,可以过滤所有包含特定标签集的项目,另一方面不允许包含其他标签。
目前,我生成的正则表达式如
/^(?=.*\bfoo\b)(?=.*\bbar\b)(?!.*\bbaz\b).*$/
不在搜索查询中。此表达式匹配包含 foo
和 bar
但 不 baz
的所有 tag
属性。这在标签以 字字符 开头和结尾时非常有效,但在其他情况下停止工作(例如,对于以点或哈希符号开头或结尾的标签)作为 字boundary 锚点仅适用于 word characters.
你知道我如何修改像 .foo#
这样的标签的正则表达式吗?
PHP 5.5+ 应支持该解决方案。
我认为你正在生成你的模式,如果是,你可以使用这样的模式:
/^(?=.*(\W|^)foo(\W|$))(?=.*(\W|^)bar(\W|$))(?!.*(\W|^)baz(\W|$)).*$/
如果不是,您可以简单地获取 \bfoo\b
之外的那些字符,例如 \.\bfoo\b#
。
一个工作示例:
^(?=.*(?<!\S)foo@(?!\S).*)(?!.*(?<!\S)_bar#(?!\S).*).*
我断言标签前后没有白色-space,而不是单词边界。单词边界是两个环视的组合;在这种情况下,您只想要两者之一(两次)。
- 标志:g、m
- 步数:270