为什么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:
答案 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引用现在结束了。