регулярное выражение php shell_exec PCRE / POSIX

У меня проблема с моим php-скриптом, когда я звоню shell_exec и передать регулярное выражение.

Код 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

Я пробовал много решений, но не смог.

1

Решение

Вы должны избежать \ персонаж с другим \так получается:

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

Другие решения

Вы должны избежать обратной косой черты:

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

Спасибо вам всем,

Я нахожу решение, я просто добавляю опцию -P для grep в моем скрипте так:

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

Теперь я могу использовать \ s

-P, —perl-regexp
Интерпретировать PATTERN как регулярное выражение Perl.

0

Проблема не в том, чтобы убежать, а просто потому, что grep основан на POSIX; Вот почему вы должны использовать [[:space:]] вместо \s, Некоторые версии grep Поддержка синтаксиса PCRE с использованием -P вариант, но использование POSIX является более переносимым.

Также, если вы хотите передать переменную из PHP в скрипт оболочки, желательно использовать escapeshellarg():

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

Следует отметить, что escapeshellarg() не работает согласованно между Windows и Linux (и даже между оболочками); в некоторых случаях вам нужно подать заявку addcslashes(),

0
По вопросам рекламы [email protected]