2

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

我有这个代码:

$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);

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

/

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

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

4

2 回答 2

2

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

$request=preg_replace('#(^'.preg_quote($webRoot).')#i','',$requestUri);
于 2012-05-08T16:53:40.293 回答
0

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

于 2012-05-08T17:22:54.037 回答