0

好的,每个人,我已经找到了多种方法,我什至让它工作,但我的问题是,我理解的 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 链接产生的额外内容,并保留用户发布的所有消息文本。有什么想法吗?谢谢。

4

2 回答 2

2

让它不贪心。

http://www\.youtube\.com/watch\?.*?\bv=([^ ]+)

?请注意这里?.*?的额外内容http://www\.youtube\.com/watch\?.*\bv=([^ ]+)

于 2012-04-25T21:46:17.130 回答
0

Jack 的代码有两个问题: - 它没有正确捕获行尾的链接(\n 字符) - 它没有删除可选的附加参数(例如。&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);
于 2013-12-04T13:08:01.947 回答