【问题标题】:Warning: Unexpected character in input: '\' (ASCII=92) state=1警告:输入中的意外字符:'\' (ASCII=92) state=1
【发布时间】:2014-07-23 18:41:12
【问题描述】:

我收到以下错误消息:

Warning: Unexpected character in input: '\' (ASCII=92) state=1

这就是给我带来麻烦的代码行。

$tag_value = preg_replace('/\{(.*?)\}/e', '$values[\\1]', $tag_value);

我使用的是 PHP 5.2.9,无法升级。

正则表达式不是我的专长,我无法自己解决这个问题。任何帮助将不胜感激。

【问题讨论】:

  • @krishna:\\1 不是错字。它指的是第一个反向引用。结合e 修饰符,这将导致\\1 被替换为正则表达式中第一个捕获组中捕获的内容,即{...} 之间的内容。替换参数需要更改为'$values["\\1"]'(否则,它很可能会抱怨未定义的常量)。
  • @AmalMurali 哦,抱歉信息有误,感谢您提供信息..
  • 看起来这与命名空间有关。见this demo。我不认为 preg_replace() 是导致此错误的原因。

标签: php regex


【解决方案1】:

您无法使用简单的preg_replace 来完成此操作,因为使用/e 修饰符无法完成数组取消引用。相反,您可以使用preg_replace_callback 函数:

$tag_value = preg_replace_callback("/\{(.*?)\}/", function($m) use($values){
    return $values[$m[1]];
}, $tag_value);

这在 php 5.3 中绝对有效,但是在 5.2 中您可能需要显式定义回调函数:

function replace($m) {
    global $values;
    return $values[$m[1]];
}
$tag_value = preg_replace_callback("/\{(.*?)\}/", "replace", $tag_value);

编辑:您看到的错误正在发生,因为使用您的原始代码,您的替换被逐字视为$values[\1](在取消反斜杠后 - 在此字符串中,\1 不是正确的东西放在括号内。

【讨论】:

  • preg_replace_callback() 确实是正确的解决方案,但我认为 OP 正在尝试解决错误 "Warning: Unexpected character in input: '\' (ASCII=92) state= 1".
  • @AmalMurali 我认为 OP 最终希望让代码正常工作。但是,为了完整起见,我将使用错误说明更新答案。
猜你喜欢
  • 2013-06-13
  • 2015-12-24
  • 2012-10-18
  • 2011-12-11
  • 2017-09-05
  • 2013-09-14
  • 1970-01-01
  • 2019-01-05
  • 2019-08-02
相关资源
最近更新 更多