我需要将所有有效链接与图片和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);
这会忽略常规链接,如何修改它以检测链接而不是其他两个?有更简单的方法吗?
由于
答案 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。