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


Match a URL that is not in a set of URL types?

我正在尝试用以下内容替换不是图像或YouTube视频的URL:

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

这仍然与之类的URL匹配http://foobar.com/baz.jpg和http://www.youtube.com/watch?v=abcdefghijk,其中粗体部分显示匹配的内容。

我该怎么解决这个问题?

您使用的是延迟匹配非空格字符的['s]*。但是,如果以下断言不匹配,它将进行回溯。所以你必须让它具有占有欲。

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

另请参阅http://www.regular-expressions.info/possessive.html

此外,您最好将视频断言移动到http://(?!youtube)的部分之后,而不是从后面进行匹配。Youtube链接中可能还有其他URL参数,所以只需匹配到/watch