Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 警告:输入中出现意外字符:'\';(ASCII=92)状态=1_Php_Regex - Fatal编程技术网

Php 警告:输入中出现意外字符:'\';(ASCII=92)状态=1

Php 警告:输入中出现意外字符:'\';(ASCII=92)状态=1,php,regex,Php,Regex,我收到以下错误消息: Warning: Unexpected character in input: '\' (ASCII=92) state=1 这是给我带来麻烦的一行代码 $tag_value = preg_replace('/\{(.*?)\}/e', '$values[\\1]', $tag_value); 我使用的是PHP5.2.9,升级不是一个选项 正则表达式不是我的专长,我无法独自解决这个问题。任何帮助都将不胜感激。您无法通过简单的预替换来完成此操作,因为数组反引用不是通过/e

我收到以下错误消息:

Warning: Unexpected character in input: '\' (ASCII=92) state=1
这是给我带来麻烦的一行代码

$tag_value = preg_replace('/\{(.*?)\}/e', '$values[\\1]', $tag_value);
我使用的是PHP5.2.9,升级不是一个选项


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

您无法通过简单的
预替换来完成此操作,因为数组反引用不是通过
/e
修饰符完成的。相反,您可以使用
preg\u replace\u 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\u replace
来完成这一点,因为数组取消引用不是用
/e
修饰符完成的。相反,你可以使用
preg\u replace\u回调
函数:

$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
不是放在括号内的正确内容。

@krishna:
\\1
不是打字错误。它指的是第一个反引用。与
e
修饰符结合,这将导致
\\1
被替换为第一个捕获组i中捕获的内容。)n正则表达式,即
{…}
之间的内容。但替换参数需要更改为
'$values[“\\1”]'
(否则,它很可能会抱怨未定义的常量)@AmalMurali Oh,抱歉提供了错误的信息,感谢您提供的信息..看起来这与名称空间有关。请看。我不认为
preg_replace()
是导致此错误的原因。@krishna:
\\1
不是打字错误。它指的是第一个反向引用。与
e
修饰符相结合,这将导致
\\1
被替换为正则表达式中第一个捕获组中捕获的内容,即
{…}之间的内容
。需要将替换参数更改为
“$values[“\\1”]”
(否则,它很可能会抱怨未定义的常量)。@AmalMurali Oh抱歉提供了错误的信息,感谢您提供的信息..看起来这与名称空间有关。请参阅。我不认为
preg_replace()
是导致此错误的原因。
preg\u replace\u callback()
确实是正确的解决方案,但我认为OP正在尝试解决错误“警告:输入中的意外字符:'\'(ASCII=92)state=1”@AmalMurali我认为OP最终想要让代码正常工作。但是,为了完整性起见,我正在用错误的解释更新答案。
preg\u replace\u callback()
确实是正确的解决方案,但我认为OP试图解决错误“警告:输入中的意外字符:'\'(ASCII=92)state=1”@AmalMurali我认为OP最终想要让代码正常工作。但是,为了完整性起见,我正在更新答案并解释错误。