【问题标题】:php shell_exec regular expression PCRE/POSIXphp shell_exec 正则表达式 PCRE/POSIX
【发布时间】:2014-12-11 08:27:19
【问题描述】:

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

PHP 代码:

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

myscript.sh:

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

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

如果我将我的 php 脚本中的 \s 替换为 [[:space:]] 类,它可以工作,但我必须使用 \s

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

【问题讨论】:

    标签: php regex posix pcre shell-exec


    【解决方案1】:

    你必须用另一个\ 转义\ 字符,所以它变成:

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

    【讨论】:

    • 谢谢你,但它不起作用......我已经测试过这个解决方案
    【解决方案2】:

    你需要转义反斜杠:

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

    【讨论】:

    • 谢谢你,但它不起作用......我已经测试过这个解决方案
    • grep 通常不使用 PCRE。也许您设置了$PATH 来查找grep 的版本,实际上是pcregrep?但是 PHP 脚本正在以不同 $PATH 的进程运行?
    【解决方案3】:

    谢谢大家,

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

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

    现在,我可以使用 \s

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        相关资源
        最近更新 更多