※ 引述《ta0306556 (POIL)》之铭言:
: 我想要抓出php上传档案的暂存盘名。
: 所以使用下面的语法做判断
: preg_match("/C:\\WINDOWS\\TEMP\\([^\.]+\.tmp)/",$_FILES['file']['tmp_name'],$m);
: 可是他却出现错误 "unmatched parentheses"
: 我要判断的资料为 "C:\WINDOWS\TEMP\php7C9.tmp"
: 目标是抓出后面的 "php7C9.tmp"
: 但是我这个正规表示法,已经在测试网页,测试过都正常。(网页如下)
: http://www.rubular.com/#
: 根据我测试的结果是TEMP\\ ←这个斜线出的问题
: 可是我也不知道该怎么改才会变成正确。
: 所以上来请教各位大大。
: 感谢大家。
改成这样就好了:
"/C:\\\\WINDOWS\\\\TEMP\\\\([^\.]+\.tmp)/"
因为 PHP 会把 "..." 中的 "\\" 替换成 "\"
所以你原来的字串会变成 "/C:\WINDOWS\TEMP\([^\.]+\.tmp)/"
对 Regex 来说,\W 可能会被解释成“英文字与数字之外的字符”,
\T 可能会解释成 T(实际情形要查一下手册,不过这里不是重点)
\( 解释成一般括号字符,但是后面有个右括号 ')' 仍然
会被解释成 group,所以就会有括号(group)不对称的错误讯息
总而言之就是 php 本身会把 "..." 中的 \\ 替换成 \,preg
又会再把 \\ 替换一次,所以你要打 4 次 \ 才会得到正确结果 :)