使用(?<! - regex断言,没有固定宽度 - >

时间:2015-02-04 13:31:58

标签: html regex

我有这个正则表达式几乎按预期工作......

(?<!color: )(?<!color:)(?<!pid=[0-9][0-9][0-9][0-9][0-9])\#(\w+)

我们说这是我的HTML代码:

<span style='color: #FFAABB'><a href='?pid=55155#pid55155'>hey #hello</a></span>

正则表达式只匹配:#hello哪个好,但重点是我不知道“pid”之后会有多少个数字,我不能使用“?”,“*”或“{n, m}“限定符有”(?&lt;!)“(我不知道为什么)。

我的问题是:有没有办法让它变得动态?

请不要建议:

(?<!color: )(?<!color:)(?<!pid=[0-9])(?<!pid=[0-9][0-9])(?<!pid=[0-9][0-9][0-9])(?<!pid=[0-9][0-9][0-9][0-9])\#(\w+)

因为它很糟糕。

这是一个有效的例子:

https://www.regex101.com/r/rC2mH4/1

提前致谢:)

2 个答案:

答案 0 :(得分:2)

如果您的语言支持(*SKIP)(*F),那么您可以使用以下内容。

(?:color:\s*|pid=\d*)#(*SKIP)(*F)|#(\w+)

DEMO

请注意,上面的\s也会匹配换行符。因此,请使用\h仅匹配水平空格。

<强>解释

  • (?:color:\s*|pid=\d*)#匹配所有#符号加上前一个color:和零个或多个空格或| pid=和零个或多个数字。所以你不想要的部分是匹配的。

  • (*SKIP)(*F)导致上一场比赛失败。 |之后的模式将尝试匹配剩余字符串中的字符。

  • 在我们的案例中,|之后的模式为#。因此#(\w+)会匹配您想要的所有哈希标记。

答案 1 :(得分:1)

color:\s*#\w+|pid=\d+#\w+|(#\w+)

你可以尝试这个。只需抓住捕获或组。参见demo.This匹配所有废话并捕获你想要的。

https://www.regex101.com/r/rC2mH4/3

$re = "/color:\\s*#\\w+|pid=\\d+#\\w+|(#\\w+)/m";
$str = "<span style=\"font-weight: bold;\">test1<span style=\"color: #FFA500;\">test2</span>test3</span>#hello#how#are#you\n<span style=\"font-weight: bold;\">test1<span style=\"color: #FFA500;\">test2</span>test3</span>#lalala #hello\n<div class=\"post_body\" id=\"pid_58705\">\n<blockquote><cite><span> (Hoy 02:42)</span>Moroha escribió: <a class=\"quick_jump\" href=\"http://test.com/Thread-hello?pid=58672#pid58672\" rel=\"nofollow\">&nbsp;</a></cite>testing</blockquote></div>\npid=97589735935795358672#foobar\n<span style='color: #FFAABB'><a href='?pid=55155#pid55155'>hey #hello</a></span>";

preg_match_all($re, $str, $matches);