php shell_exec正则表达式 PCRE/POSIX


php shell_exec regular expression PCRE/POSIX

当我调用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

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

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

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

您需要转义反斜杠:

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

谢谢大家,

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

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

现在,我可以使用''s

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

问题不在于转义,而仅仅是因为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()