匹配不在一组URL类型中的URL?

时间:2012-08-05 13:46:19

标签: php regex regex-negation

我正在尝试使用以下内容替换非图像或YouTube视频的网址:

preg_replace('#(http://([^\s]*)(?<!\.(?:jpg|gif|png))(?<!youtube\.com/watch\?v=\w{11}))#', '<a href = $1> $1 </a>', $output);

这仍然匹配 http://foobar.com/baz.jp g和 http://www.youtube.com/watch?v=abcdefghij 等网址k,其中粗体部分显示匹配的内容。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您正在使用[\s]*懒惰地匹配非spacy字符。但是,如果以下断言不匹配,它将进行跟踪。所以你必须把它变得占有欲。

使用\S*+执行此操作。其中\S表示所有非空格字符(实际上与[^\s]相同,但更简洁)。并且+量词之后的*避免了PCRE在断言失败的情况下以字符方式缩回。

另见http://www.regular-expressions.info/possessive.html

此外,您应该优先在http://部分之后使用(?!youtube)移动视频断言,而不是从后面进行匹配。 Youtube链接中可能还有其他网址参数,因此只需匹配/watch