我有一个包含大量文本,bbcodes和URL的字符串,我从bbcode-Youtube-urls中提取ID,然后用嵌入式youtube iframe替换bbcode。到目前为止这么好,这是有效的。
但对于我的网站,我需要添加" ?wmode = opaque " iframe src =" // www.youtube.com/embed/$1" 属性,但"?"没有使用preg_replace。
这是基本代码:
function youtube_bbcode_format($str){
// extract id
$format_search = array(
'#\[youtube\].*[?&]v=([^?&]+)\[/youtube\]#i' // Youtube extract id
);
// replace string (youtube embed iframe) plus the ?wmode=opaque parameter
$format_replace = array(
'<iframe width="320" height="180" src="//www.youtube.com/embed/$1?wmode=opaque" frameborder="0" allowfullscreen></iframe>'
);
// do the replacement
$str = preg_replace($format_search, $format_replace, $str);
return $str;
}
我试过逃避&#34;?&#34;以各种方式/ embed / $ 1旁边的问号,以下示例DON&#39; T work : (在所有示例中,$ 1都被youtube id正确替换,我只是不是每次都写下来)
src="//www.youtube.com/embed/$1?wmode=opaque"
在浏览器中,缺少1美元后的所有内容,包括&#34;?&#34;结果:/ $ 1
src="//www.youtube.com/embed/$1\?wmode=opaque"
逃跑并没有真正起作用。结果:/ $ 1 \?wmode = opaque(反斜杠应该消失!)
src="//www.youtube.com/embed/$1\\?wmode=opaque"
与之前相同,结果:/ $ 1 \?wmode = opaque
src="//www.youtube.com/embed/$1??wmode=opaque"
结果:/ $ 1 ?? wmode = opaque
src="//www.youtube.com/embed/\${1}?wmode=opaque"
结果:/ $ {1}?wmode = opaque
最后一次尝试是最有希望的,因为在手册中它表示处理这类问题的方法,但它没有用。
如何逃避替换字符串中的&#34;?&#34; 的任何想法?
PS: 输入字符串的示例:
str = "music is by [color=blue][size=20][b]Pegboard Nerds - Hero (feat. Elizaveta)[/b][/size][/color]. you can listen to it here:[br][youtube]youtube.com/watch?v=5lLclBfKj48[/youtube]";
(其他bbcode标签在其他地方处理)
答案 0 :(得分:0)
试试这个:
function youtube_bbcode_format($str){
// extract id
$format_search = array(
'#\[youtube\].*[?&]v=([^?&]+)\[/youtube\]#i' // Youtube extract id
);
// replace string (youtube embed iframe) plus the ?wmode=opaque parameter
$format_replace = array(
'<iframe width="320" height="180" src="//www.youtube.com/embed/$1'
);
// do the replacement
$str = preg_replace($format_search, $format_replace, $str).'?wmode=opaque" frameborder="0" allowfullscreen></iframe>';
return $str;
}
答案 1 :(得分:0)
感谢大家验证代码示例。你没事,代码片段本身就像预期的那样工作。 我确定问题是在preg_replace引用中,但我错了。问题的根源来自我的源代码中的另一部分:$ str通过另一个preg_replace函数传递,该函数将问号剪掉。
preg_replace_callback("&\\b$rexProtocol$rexDomain$rexPort$rexPath$rexQuery$rexFragment(?=[?.!,;:\"]?(\s|$))&", 'callback', $str);
preg_replace_callback函数应该用真实链接替换文本链接..但如果在我的基本代码被剪切后调用它,那么“?”之后的所有内容(包括他自己)失踪了。
代码段本身确实有用。谢谢你帮忙。