preg_replace没有逃脱"?"在引用中

时间:2014-03-22 17:07:38

标签: php reference escaping preg-replace

我有一个包含大量文本,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标签在其他地方处理)

2 个答案:

答案 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函数应该用真实链接替换文本链接..但如果在我的基本代码被剪切后调用它,那么“?”之后的所有内容(包括他自己)失踪了。

代码段本身确实有用。谢谢你帮忙。