我已经研究了这个问题将近 5 个小时,我能想到的最好的就是 Stackoverflow 帖子中的这段代码:
<?php
$pattren = '%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/]{11})%i';
?>
我想要完成的是我有一个由其他人编写的定制网络论坛,我想添加直接在论坛主题中观看 YouTube 视频的能力,我尝试了不同的代码和模式,最好的一个是我发布的那个在这篇文章中,它几乎可以匹配任何 YouTube 链接,但是我无法用这段代码解决一个问题,论坛中使用的 BBCode 标签是[yt]youtubelink[/yt]
,我尝试在模式前加上
<?php
$pattren = '%\[yt\](?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/]{11})[\/yt]%i';
?>
但它只是不起作用,没有任何错误报告表明模式存在问题
我使用的完整代码
<?php
$testmessage = "test youtube links [yt]http://www.youtube.com/watch?v=ZCLAwp2HbW4&feature=player_embedded[/yt] more text";
$pattren1 = '%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i';
$pattren2 = '%\[yt\](?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})[\/yt]%i';
echo '<h1>works:-</h1>';
echo preg_replace($pattren1, '<iframe width="350" height="250" sandbox="" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $testmessage);
echo '<h1>doesnt work:-</h1>';
echo preg_replace($pattren2, '<iframe width="350" height="250" sandbox="" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $testmessage);
?>
同样,虽然第一个模式部分有效,但它也会留下一些 URL 查询字符串,例如第一个模式在它确实有效并获取视频 ID 时,它将这部分留在文本消息中&feature=player_embedded
更新:
我无法让它直接使用 preg_replace,所以我想出了不同的方法来解决这个问题,我会发布代码,它可能对某人有用,这样他就不会浪费 6 小时的生命又是这个问题!
<?php
$test = "test youtube links [yt]http://www.youtube.com/watch?v=ZCLAwp2HbW4&feature=player_embedded[/yt] more text";
echo preg_replace_callback('#\[yt\](.*)\[/yt\]#i', function ($matches) {
$regex = '#(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})#i';
preg_match($regex, $matches[1], $found);
if ($found[1])
return '<iframe width="350" height="250" sandbox="" src="http://www.youtube.com/embed/'.$found[1].'" frameborder="0" allowfullscreen></iframe>';
}, $test);
?>
此代码适用于 PHP 5.3 以使其适用于 < PHP5.3 将匿名函数移动到单独的函数。