为什么在这种情况下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/

10-15 01:41