好吧,这个问题似乎超出了我的头!
我有这个代码:
$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),同样的事情发生了。
,我个人会使用另一个字符作为分隔符,例如"#",因为 $ char 是一个正则表达式特殊字符,它在字符串末尾匹配应用正则表达式模式。也就是说,我不得不在Windows服务器上工作的几次,我发现每个正则表达式都必须通过preg_quote函数传递,更不用说它是否包含正则表达式特殊字符。
$request=preg_replace('#(^'.preg_quote($webRoot).')#i','',$requestUri);
abidibo 的答案是正确的,但显然问题是由 str_replace() 函数中的错误引起的。出于某种原因,在 Windows Apache 和 nginx 中,此函数会损坏字符串并用无法读取的符号填充它。