php exec shell命令与regexp匹配

时间:2014-01-25 03:45:20

标签: php regex exec

我正在创建一个小算法来修复msgid整个源代码,所以这个工作正常:

$ find . -name '*.php' | xargs perl -pi -e 's/\$t\(\047bad msgid\047\);/\$t\(\047good msg id\047\);/g'

我想在php脚本的foreach中创建执行,例如:

$cmd = "find {$projectPath} -name '*.php' | xargs perl -pi -e 's/\$t\('\047'" . preg_quote($bad) . "\047\)/\$t\(\047" . preg_quote($good) . "\047\)/g'";
exec(escapeshellarg($cmd));

它的疯狂我尝试了一切,escapeshellarg,混合双引号与单引号,反斜杠引用.. 4小时后我可以告诉一个fu * ck这和shell exec cmd。 PS。 fuc * k reg exp

在exec方法中运行此命令的想法是什么?


解决方案 for find $ t('miss msgid')替换为整个项目中的$ t('right msgid')usind php,perl,exec(在mac上测试)

+ 1h和2rev,感谢建议@Marc B:

$cmd = "find {$projectPath} -name '*.php' | xargs perl -pi -e 's|\\\$t\(\\047" . str_replace("'", "\\047", preg_quote($bad)) . "\\047\)|\\\$t\(\\047" . str_replace("'", "\\047", preg_quote($good)) . "\\047\)|g'";
exec($cmd);

1 个答案:

答案 0 :(得分:0)

对引用的基本理解会有所帮助......

PHP使用你的$ cmd字符串定义中的\

escapeshallarg()仅处理引号,因此xargs中的$t将逐字传递给shell,因此您最终完成的操作相当于在shell提示符下键入以下内容:

$ find /project/path -name '*.php' | xargs .... 's/$t etc....'

$t将由shell扩展,并且由于您没有在此新shell中定义$t,因此您的正则表达式变为

's/('\047
   ^---hey, no $t value!

尝试

$cmd = "find {$projectPath} -name '*.php' | blah blah s/\\$t etc...
                                                        ^^--double escape

PHP将消耗一个反斜杠,将s/\$t留在字符串中。当它变为shell时,\$t将作为$t传递给perl并被视为perl变量......