正则表达式匹配链接但不匹配图像或youtube视频

时间:2012-08-05 06:08:00

标签: php regex

我需要将所有有效链接与图片和YouTube视频的链接分开匹配。我想在常规链接周围添加锚标记,但分别在图像和YouTube视频周围添加img和iframe标记。

这是我的代码

$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);

这会忽略常规链接,如何修改它以检测链接而不是其他两个?有更简单的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

使用两个负面的lookbehind断言。

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

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

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

请注意,负向lookbehind断言不能包含可变长度的通配符。因此,必须要有一个规则,例如“YouTube视频由11个字符的字符串标识。”

这是Rubular demo