PHP正则表达式:匹配包含复杂字符集的匹配的若干包含/排除规则

问题描述:

考虑项目集合。每个项目可能没有,分配一个或多个标签。标记名称可能由任何有效的unicode字符组成,除了空格(空格,换行符等)。每个项目的tag属性是空格分隔的标签列表,例如, tag1 tag2 tag3PHP正则表达式:匹配包含复杂字符集的匹配的若干包含/排除规则

我目前正在研究一个PHP函数,它为包含特定标记集的人过滤所有项目,另一方面不允许包含其他人。

目前,我产生一个正则表达式像

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

了搜索查询。该表达式匹配包含foobar而不是baz的所有tag属性。这是完美的,而标签以单词字符开始和结束,但以其他方式停止工作(例如,以标记开始或以点号或散列符号结尾的标记)作为字边界锚点仅适用于单词字符

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

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

+0

如若'包含.foo#''匹配... FOO#%'或'abc.foo#DEF '或'(SPACES).foo#'? – Toto

我想你生成你的模式,如果是的话,你可以使用一种模式是这样的:

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

[Regex Demo]

如果不是你可以简单地得到\bfoo\b\.\bfoo\b#之外的字符。

+0

适合我,谢谢! – muffel

+0

您的欢迎;)。 –

工作的示例:

^(?=.*(?<!\S)[email protected](?!\S).*)(?!.*(?<!\S)_bar#(?!\S).*).*

而不是一个单词边界之前我和标签后,已经没有维护自己的空白。单词边界是两个查找表的组合;在这种情况下,您只需要两个中的一个(两次)。

  • 标志:G,M
  • 步骤:270

Demo