我正在尝试使用以下内容替换非图像或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,其中粗体部分显示匹配的内容。
我该如何解决这个问题?
答案 0 :(得分:0)
您正在使用[\s]*
懒惰地匹配非spacy字符。但是,如果以下断言不匹配,它将进行跟踪。所以你必须把它变得占有欲。
使用\S*+
执行此操作。其中\S
表示所有非空格字符(实际上与[^\s]
相同,但更简洁)。并且+
量词之后的*
避免了PCRE在断言失败的情况下以字符方式缩回。
另见http://www.regular-expressions.info/possessive.html
此外,您应该优先在http://
部分之后使用(?!youtube)
移动视频断言,而不是从后面进行匹配。 Youtube链接中可能还有其他网址参数,因此只需匹配/watch