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

Php 是否匹配不在一组URL类型中的URL?,php,regex,regex-negation,Php,Regex,Regex Negation,我正在尝试将不是图像或YouTube视频的URL替换为以下内容: preg_replace('#(http://([^\s]*)(?<!\.(?:jpg|gif|png))(?<!youtube\.com/watch\?v=\w{11}))#', '<a href = $1> $1 </a>', $output); preg\u replace('#)(http://([^\s]*)(?您正在使用的[\s]*延迟匹配非空间字符。但是,如果以下断言不匹配,它将

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

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

preg\u replace('#)(http://([^\s]*)(?您正在使用的
[\s]*
延迟匹配非空间字符。但是,如果以下断言不匹配,它将回溯。因此,您必须将其设为占有

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

另见

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