Regex匹配链接,但不匹配图像或youtube视频


Regex to match links but not images or youtube videos

我需要将任何有效链接与图像和youtube视频的链接分开匹配。我想把锚标签放在常规链接周围,但img和iframe标签分别放在图像和youtube视频周围。

这是我的代码

$str = "some stuff with links"
    $output = preg_replace('#(http://([^'s]*)'.(jpg|gif|png))#', 
                    '<img src="$1" alt="" width="" height="" />', $str);

    $output = preg_replace('#(http://([^'s]*)youtube'.com/watch'?v=([^'s]*))#', 
                  '<iframe width="420" height="315" src="http://www.youtube.com/embed/$3" frameborder="0" allowfullscreen></iframe>', $output);
    var_dump($output);

这忽略了常规链接,我如何修改它来检测链接而不检测其他两个?有没有更简单的方法?

感谢

使用两个否定的后备断言。

/^(http:'/'/([^'s]*)(?<!'.(?:jpg|gif|png))(?<!youtube'.com'/watch'?v='w{11}))$/

或者,使用#作为分隔符,

#^(http://([^'s]*)(?<!'.(?:jpg|gif|png))(?<!youtube'.com/watch'?v='w{11}))$#

请注意,反向查找断言不能有可变长度的通配符。因此,人们必须期待一个规则,例如"YouTube视频由11个字符串标识。"

这是一个Rubular演示。