【问题标题】:preg_replace(), no ending delimiter '$' foundpreg_replace(),没有找到结束分隔符 '$'
【发布时间】:2012-05-08 16:30:43
【问题描述】:

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

我有这个代码:

$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) 并且发生了同样的事情。

【问题讨论】:

  • 您使用元字符作为分隔符有什么原因吗?
  • 在使用不同的分隔符(例如/#)时是否会出现同样的错误?
  • 我最初使用 / 作为分隔符(这就是为什么我在那里有 str_replace,因为我正在处理 URL)。美元符号是我在尝试解决方案后使用的。
  • @kristovaher:使用与$ 不同的分隔符(/ 很常见),并使用str_replace 代替preg_quote($webRoot, '/')

标签: php windows apache preg-replace


【解决方案1】:

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

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

【讨论】:

  • 出于某种原因..宾果游戏。显然,出于某种原因,Windows 不喜欢手动分隔符字符串替换。但是 preg_quote 有效。这是旧 PHP 版本所没有的问题,因为我之前在该环境中运行过代码,但现在显然这是一个问题。干杯!
【解决方案2】:

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

【讨论】:

  • 可能你是对的,但我很确定 php + Windows 需要 preg_quote,即使正则表达式字符串没有通过 str_replace 传递,至少这发生在我在 WAMP 环境中开发 php 框架时,不记得是哪个 5
  • 请原谅(从手机上写),结论是我不记得我运行的是哪个 5.x php 版本。干杯!
  • 实际上不,它没有,我在 The Uniform Server 上使用最新的 PHP 和 Apache 进行了相同的测试,但没有发生这种情况。这个 str_replace() 但似乎只发生在 nginx 和 PHP 上。那里有一些很不对劲的地方。但是您的提示很好,因为这是为正则表达式转义的正确方法。
猜你喜欢
  • 2013-06-17
  • 1970-01-01
  • 2013-06-15
  • 2012-03-30
  • 2016-12-07
  • 1970-01-01
  • 2011-09-20
  • 2015-12-24
相关资源
最近更新 更多