为什么在这种情况下preg_replace不返回任何内容?我一直在努力弄清楚整个晚上。
这是$ postContent中包含的文本:
测试一下。这是一个报价:[Quote] 1 [/ Quote]报价已结束。
这是我的代码:
echo "Test I'm Here!!!";
$startQuotePos = strpos($postContent,'[Quote]')+7;
$endQuotePos = strpos($postContent,'[/Quote]');
$postStrLength = strlen($postContent);
$quotePostID = substr($postContent,$startQuotePos,($endQuotePos-$postStrLength));
$quotePattern = '[Quote]'.$quotePostID.'[/Quote]';
$newPCAQ = preg_replace($quotePattern,$quotePostID,$postContent);
echo "<br />$startQuotePos<br />$endQuotePos<br />$quotePostID<br />Qpattern:$quotePattern<br />PCAQ: $newPCAQ<br />";
这是我的结果:
测试我在这里!
35
36
1个
Qpattern:[报价] 1 [/报价]
PCAQ:
最佳答案
对于preg_replace()
,"[Quote]"
匹配一个以下字符之一:q,u,o,t或e。
如果希望preg_replace()
查找文字"[Quote]"
,则需要将其转义为"\[Quote\]"
。 preg_quote()是您应该使用的功能:preg_quote("[Quote]")
。
您的代码也是错误的,因为期望正则表达式以分隔符开头。在preg_replace()
调用中,我在答案的末尾显示@,但您可以使用其他字符,只要该字符不出现在正则表达式中,并且也可在正则表达式。 (在我的情况下,@后跟一个模式修饰符,并且模式修饰符是模式定界符之后唯一允许的字符。)
如果要使用preg_replace()
,则首先找到"[Quote]"
的位置就没有意义。我宁愿使用以下代码:
$newPCAQ = preg_replace('@\[Quote\](.+?)\[/Quote\]@i', '\1', $postContent);
我将解释我使用的正则表达式:
最后的
'@i'
是对preg_replace()
说的,以忽略小写和大写字符之间的区别;该字符串可以包含"[QuOte]234[/QuOTE]"
,并且该子字符串将与正则表达式相同。我在
"(.+?)"
中使用问号,以避免".+"
过于贪婪,并且匹配太多字符。如果没有它,则正则表达式可以在单个匹配项中包含一个像"[Quote]234[/Quote] Other text [Quote]475[/Quote]"
这样的子字符串,而应将它作为两个子字符串进行匹配:"[Quote]234[/Quote]"
和"[Quote]475[/Quote]"
。我用作替换字符串的
'\1'
字符串是对preg_replace()
说使用从子组"(.+?)"
匹配的字符串作为替换。换句话说,对preg_replace()
的调用将删除"[Quote]"
,并且"[/Quote]"
包围其他文本。 (它不会替换与"[/Quote]"
不匹配的"[Quote]"
,例如"[/Quote] Other text [Quote]"
。)关于php - preg_replace PHP无法正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13785358/