preg_replace PHP无法正常工作?

时间:2012-12-09 06:47:32

标签: php preg-replace

为什么preg_replace在这种情况下不返回任何内容?我一直试图弄清楚它。

以下是$ postContent中包含的文字:

测试一下。这是一个引用:[报价] 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:

3 个答案:

答案 0 :(得分:2)

你的正则表达式必须开始&amp;以'/'结尾:

$quotePattern = '/[Quote]'.$quotePostID.'[/Quote]/';

答案 1 :(得分:2)

对于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]"中。)

答案 2 :(得分:1)

您没有看到preg_replace的返回值的原因是因为它已返回NULL请参阅手册链接了解详情)。这是preg_replace在发生错误时返回的内容,这就是您的情况。字符串值NULL零长度字符串。您可以使用var_dump来查看,这将告诉您preg_replace返回NULL。

您的正则表达式无效,因此PHP会导致E_WARNING级错误Warning: preg_replace(): Unknown modifier '['

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

$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:@ [报价] 1 [/报价] @

PCAQ:测试一下。这是一个引用:1引用现在结束了。