[英]PHP preg_replace error
我有以下代码:
protected function safePath($path) {
$path = (string) $path;
$path = preg_replace(
array(
'#[\n\r\t\0]*#im',
'#/(\.){1,}/#i',
'#(\.){2,}#i',
'#(\.){2,}#i',
'#\('.DIRECTORY_SEPARATOR.'){2,}#i'
),
array(
'',
'',
'',
'/'
),
$path
)
;
return rtrim($path,DIRECTORY_SEPARATOR);
}
使用路径执行函数后,出现以下错误:
警告 :preg_replace()[function.preg-replace]:编译失败: 534行上...... / myfile.php中偏移量3处的括号不匹配
这是第534行,在此处标记为:
protected function safePath($path) {
$path = (string) $path;
$path = preg_replace(
array(
'#[\n\r\t\0]*#im',
'#/(\.){1,}/#i',
'#(\.){2,}#i',
'#(\.){2,}#i',
'#\('.DIRECTORY_SEPARATOR.'){2,}#i'
),
array(
'',
'',
'',
'/'
), <---------------- THis is line 534
$path
)
;
return rtrim($path,DIRECTORY_SEPARATOR);
}
对解决此错误有帮助吗? 谢谢。
在最后一个正则表达式中,您逃脱了左括号,但没有逃脱右括号
'#\('.DIRECTORY_SEPARATOR.'){2,}#i'
应该是...
'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'
^
|
missing slash
...或者斜线根本不应该存在。 无论哪种方式,其都不一致。
因为这里有这部分:
'#\('.DIRECTORY_SEPARATOR.'){2,}#i'
我猜你在Linux系统上。 在Windows上,DIRECTORY_SEPARATOR是反斜线,与该行上的初始反斜线匹配。
在linux上,DIRECTORY_SEPARATOR是一个正斜杠,因此此字符串的开头有一个转义的左括号,而结尾没有匹配的括号。
您可以通过用/
或\\
替换该行上的DIRECTORY_SEPARATOR来在两种类型的OS上重现该错误。 您会立即看到结果。
奇怪的是,只有两个假肢都逃脱了,我才能得到该错误:
'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'
也许是因为您没有逃避DIRECTORY_SEPARATOR?
'#\(\\'.DIRECTORY_SEPARATOR.'\){2,}#i'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.