preg_replace(),找不到结束分隔符'$'

时间:2012-05-08 16:30:43

标签: php windows apache preg-replace

好吧,这个问题似乎超出了我的想法!

我有这段代码:

$request=preg_replace('$(^'.str_replace('$','\$',$webRoot).')$i','',$requestUri);

这引发了一个错误:

preg_replace():找不到结尾分隔符'$'

但是事情就是这样,那个结束的界限肯定在那里。

在该函数调用之后,我回应了以下内容:

echo $webRoot;
echo $requestUri;
echo '$(^'.str_replace('$','\$',$webRoot).')$i';

这是这些回声的结果:

/
/en/example/
$(^/)$i

有趣的是,如果我直接这样做:

preg_replace('$(^/)$i','',$requestUri);

..它有效。但这也失败了:

$tmp=str_replace('$','\$',$webRoot);
preg_replace('$(^'.$tmp.')$i','',$requestUri);

为了彻底,我还测试了回显$ tmp给出的内容,它确实给出了正确的值:

/

这是Windows中PHP的错误吗?我在Linux服务器上试了一下,它按预期工作,它没有抛出这个错误。或者我错过了什么?

为了确保,我甚至将PHP更新到最新的Windows版本(5.4.2),同样的事情发生了。

2 个答案:

答案 0 :(得分:1)

好吧,我个人会使用另一个字符作为'#'这样的分隔符,因为$ char是一个regexp特殊字符,它匹配应用正则表达式模式的字符串末尾。这就是说,我必须在Windows服务器上工作几次,我发现每个正则表达式都必须通过preg_quote函数传递,如果它包含或不包含regexp特殊字符,则永远不要。

$request=preg_replace('#(^'.preg_quote($webRoot).')#i','',$requestUri);

答案 1 :(得分:0)

abidibo的回答是正确的,但显然问题是由str_replace()函数中的错误引起的。出于某种原因,在Windows Apache和nginx中,此函数会破坏字符串并使用无法读取的符号填充它。