0

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

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等 URL ,其中粗体部分显示匹配的内容。

我怎样才能解决这个问题?

4

1 回答 1

0

您正在使用[\s]*which 懒惰地匹配非空格字符。但是,如果以下断言不匹配,它将回溯。所以你必须让它占有欲。

用于\S*+这样做。where\S表示所有非空格字符(与[^\s]实际相同,但更简洁)。并且+*量词之后避免了 PCRE 在断言失败的情况下按字符收回。

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

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

于 2012-08-05T14:03:44.223 回答