好的大家,我已经找到了多种方法来实现这一点,我甚至让它工作但我的问题是这个,我理解的preg_replace应该替换匹配模式的所有内容,但它似乎只运行一次。
以下是我需要的内容,我有一个网站正在运行一项功能,让用户可以在他们的个人资料上发布他们想要的任何内容,我们希望让他们也发布youtube链接并将这些链接转换为嵌入。问题出现在他们发布多个视频时,它只会嵌入其中一个视频,更糟糕的是它会删除文本。
$test = "This is a great lecture: http://www.youtube.com/watch?v=Ps8jOj7diA0 This is another great lecture http://www.youtube.com/watch?v=k6U-i4gXkLM What are your opinions on the two?"
$patterns[] = '|http://www\.youtube\.com/watch\?.*\bv=([^ ]+)|';
$replacements[] = ' <br /><iframe width="420" height="315" src=http://www.youtube.com/embed/$1 frameborder="0" allowfullscreen></iframe><br />';
$patterns[] = '|&feature=related|';
$replacements[] = '';
$test = preg_replace($patterns, $replacements, $test);
echo $test;
Output:
"This is a great lecture:
<iframe width="420" height="315" src=http://www.youtube.com/embed/k6U-i4gXkLM frameborder="0" allowfullscreen></iframe>
What are your opinions on the two?"
所以你看......它会切断第一个和第二个视频之间的所有内容,只嵌入第二个视频。我需要一个解决方案,让我删除youtube链接产生的额外内容,并保留用户发布的所有消息文本。有什么想法吗?感谢。
答案 0 :(得分:2)
让它不贪婪。
http://www\.youtube\.com/watch\?.*?\bv=([^ ]+)
请注意?
?.*?
http://www\.youtube\.com/watch\?.*\bv=([^ ]+)
答案 1 :(得分:0)
杰克的代码存在两个问题: - 它没有正确捕获一行末尾的链接(\ n字符) - 它不会删除可选的附加参数(例如&amp; list = ...)
以下是完整的代码:
$test = "This is a great lecture: http://www.youtube.com/watch?v=Ps8jOj7diA0&list=PL33AFE53E080251DF This is another great lecture http://www.youtube.com/watch?v=k6U-i4gXkLM What are your opinions on the two?"
$patterns = array('|http://www\.youtube\.com/watch\?.*?\bv=([^&]+).+?\s|i');
$replacements = array(' <br /><iframe width="400" height="300" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe><br />');
$test= preg_replace($patterns, $replacements, $test);