我有以下代码:
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]:编译失败: ...... / myfile.php 中偏移3处的不匹配括号 534
行其中第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);
}
修复此错误的任何帮助?谢谢。
答案 0 :(得分:2)
在最终的正则表达式中,你已经逃过了左括号,但没有结束那个
'#\('.DIRECTORY_SEPARATOR.'){2,}#i'
也许应该......
'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'
^
|
missing slash
...或者也许斜线根本不应该存在。无论哪种方式,它都不一致。
答案 1 :(得分:1)
这是因为这部分就在这里:
'#\('.DIRECTORY_SEPARATOR.'){2,}#i'
我猜你是在Linux系统上。在Windows上,DIRECTORY_SEPARATOR是一个反斜杠,它与你在该行上的初始反斜杠相匹配。
在Linux上,DIRECTORY_SEPARATOR是正斜杠,因此该字符串在开头有一个转义左括号,末尾没有匹配的括号。
您只需使用/
或\
替换该行上的DIRECTORY_SEPARATOR,即可在任何类型的操作系统上重现错误。你会马上看到结果。
答案 2 :(得分:0)
强大奇怪,如果两个parethesees被逃脱,我只能得到错误:
'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'
也许是因为你没有逃离DIRECTORY_SEPARATOR?
'#\(\\'.DIRECTORY_SEPARATOR.'\){2,}#i'