php shell_exec正则表达式PCRE / POSIX

时间:2014-12-11 08:27:20

标签: php regex posix pcre shell-exec

当我调用shell_exec并传递正则表达式时,我的php脚本出现问题。

PHP代码:

shell_exec("sh myscript.sh 'FOO\s*ONE'");

myscript.sh:

result=$(grep -c "${1}"  myLongFile.txt)
echo ${result}

像这样,它返回0但如果il直接使用cmd grep -c "FOO\s*ONE" myLongFile.txt调用,则会返回23

如果我在我的php脚本\s中替换了[[:space:]]课程,那么我必须使用\s

我尝试了很多解决方案,但失败了。

4 个答案:

答案 0 :(得分:0)

您必须使用其他\转义\字符,因此它会变为:

 shell_exec("sh myscript.sh 'FOO\\s*ONE'");

答案 1 :(得分:0)

你需要逃避反斜杠:

shell_exec("sh myscript.sh 'FOO\\s*ONE'");

答案 2 :(得分:0)

问题不在于转义,而在于grep是基于POSIX的;这就是您应该使用[[:space:]]而不是\s的原因。某些版本的grep使用-P选项支持PCRE语法,但使用POSIX更具可移植性。

此外,如果您想将变量从PHP传递到shell脚本,建议您使用escapeshellarg()

$re = 'FOO[[:space:]]*ONE';
shell_exec(sprintf("sh myscript.sh %s", escapeshellarg($re)));

应该提到的是escapeshellarg()在Windows和Linux之间(甚至在shell之间)不能一致地工作;在某些情况下,您需要申请addcslashes()

答案 3 :(得分:0)

谢谢大家,

我找到了解决方案,我只是在我的脚本中为grep添加选项-P,如下所示:

result=$(grep -P -c "${1}"  myLongFile.txt)

现在,我可以使用 \ s

  

-P, - pel-regexp           将PATTERN解释为Perl正则表达式。