preg_replace 没有转义“?”在参考文献中

Posted

技术标签:

【中文标题】preg_replace 没有转义“?”在参考文献中【英文标题】:preg_replace not escaping "?" within references 【发布时间】:2014-03-22 17:07:38 【问题描述】:

我有一个包含大量文本、bbcode 和 URL 的字符串,我从 bbcode-Youtube-urls 中提取 ID,然后将 bbcode 替换为嵌入式 youtube iframe。到目前为止一切顺利,这是有效的。

但对于我的网站,我需要将“?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   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;

我尝试转义“?” /embed/$1 旁边的问号以各种方式,以下示例不起作用: (在所有示例中,$1 都正确替换为 youtube id,我只是没有每次都写下来)

src="//www.youtube.com/embed/$1?wmode=opaque"

在浏览器中,$1 之后的所有内容都丢失了,包括“?”结果:/$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

最后一次尝试是最有希望的,因为在手册中它说这是处理这类问题的方法,但它不起作用。

关于如何在替换字符串中转义“?”的任何想法?

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标签在别处处理)

【问题讨论】:

尝试转义'#\[youtube\].*[\?&amp;]v=([\^\?&amp;]+)\[/youtube\]#i' 你能在失败的地方发布一些$str 的示例值吗? 匹配 youtube id 的模式不是问题,即使没有转义“?”,它已经运行良好。在模式匹配中。但是我也尝试过在那里转义,并且出现了预期的结果:与没有转义的情况相同。 @user3450177 用户代码适用于我的 php 版本。尝试执行代码at here。它对我有用。 eval.in/124927 【参考方案1】:

试试这个:

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   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;

【讨论】:

Afaik 这会将 "?wmode=opaque" 添加到整个 $str 文本的末尾(参见 $str 示例数据)。但 $str 包含大量文本、url、youtube 链接,并且 youtube 链接不必在 $str 的末尾。【参考方案2】:

感谢大家验证代码示例。你没问题,代码 sn-p 本身就像预期的那样工作。 我确定问题出在 preg_replace 引用中,但我错了。问题的根源来自我源代码的另一部分:$str 是通过另一个 preg_replace 函数传递的,该函数将问号去掉。

    preg_replace_callback("&\\b$rexProtocol$rexDomain$rexPort$rexPath$rexQuery$rexFragment(?=[?.!,;:\"]?(\s|$))&", 'callback', $str);

preg_replace_callback 函数应该用真实链接替换文本链接.. 但如果在我的基本代码被剪断后调用它,“?”后面的所有内容(包括它自己)丢失了。

代码 sn-p 本身确实有效。感谢您的帮助。

【讨论】:

以上是关于preg_replace 没有转义“?”在参考文献中的主要内容,如果未能解决你的问题,请参考以下文章

宽字节注入方法原理

./libraries/classes/Util.php#1425 preg_replace() 中的警告:JIT 编译失败:没有更多内存

PHP 使用preg_replace替换字符串中的url,即使没有http://

使用 preg_replace 保存换行符

php怎么实现搜索高亮,注意是分开的字符

PHP7 preg_replace出错及解决办法