2

为什么 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:

4

3 回答 3

3

For preg_replace(),"[Quote]"匹配以下之一的单个字符:quote

如果你想preg_replace()找到文字"[Quote]",你需要将它转义为"\[Quote\]". preg_quote()是您应该使用的函数:preg_quote("[Quote]").

您的代码也是错误的,因为正则表达式应该以分隔符开头。在preg_replace()我在答案末尾显示的呼叫中,即@,但您可以使用另一个字符,只要它不出现在正则表达式中,并且它也在正则表达式的末尾使用。(在我的例子中,@后跟一个模式修饰符,而模式修饰符是模式分隔符后唯一允许的字符。)

如果要使用preg_replace(),首先找到 where is 是没有意义"[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]"。)

于 2012-12-09T07:07:19.550 回答
2

您的正则表达式必须以“/”开头和结尾:

$quotePattern = '/[Quote]'.$quotePostID.'[/Quote]/';
于 2012-12-09T06:51:28.683 回答
1

preg_replace的返回值看不到任何内容的原因是它已返回NULL有关详细信息,请参阅手册链接)。这是发生错误时 preg_replace 返回的内容,这就是您的情况。的字符串值NULL是一个长度为零的字符串。您可以通过使用var_dump来查看这一点,它会告诉您 preg_replace 返回 NULL。

您的正则表达式无效,因此 PHP 将抛出一个E_WARNING级别错误Warning: preg_replace(): Unknown modifier '['

这有几个原因。首先,您需要为您的正则表达式指定一个开始和结束分隔符,因为 preg_* 函数使用PCRE 样式的正则表达式。其次,您还想考虑在您的模式(没有分隔符)上使用preg_quote以确保它被正确转义。

$postContent = "Test this. Here is a quote: [Quote]1[/Quote] Quote is now over.";
/* Specify a delimiter for your regular expression */
$delimiter = '@';

$startQuotePos = strpos($postContent,'[Quote]')+7;
$endQuotePos = strpos($postContent,'[/Quote]');
$postStrLength = strlen($postContent);
$quotePostID = substr($postContent,$startQuotePos,($endQuotePos-$postStrLength));
/* Make sure you use the delimiter in your pattern and escape it properly */
$quotePattern = $delimiter . preg_quote("[Quote]{$quotePostID}[/Quote]", $delimiter) . $delimiter;
$newPCAQ = preg_replace($quotePattern,$quotePostID,$postContent);
echo "<br />$startQuotePos<br />$endQuotePos<br />$quotePostID<br />Qpattern:$quotePattern<br />PCAQ: $newPCAQ<br />";

输出将是:

35

36

1

Qpattern:@[Quote]1[/Quote]@

PCAQ:测试一下。这是一个报价: 1 报价现已结束。

于 2012-12-09T07:10:51.500 回答