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\].*[\?&]v=([\^\?&]+)\[/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 编译失败:没有更多内存