繁体   English   中英

带有regexp匹配的php exec shell命令

[英]php exec shell command with regexp matching

我正在创建小的算法来修复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,将双引号与单引号,反斜杠引号混合在一起。.4h之后,我可以告诉我这个和shell exec cmd。 PS。 fuc * k reg exp也

有什么想法可以在exec方法中运行此命令吗?


解决方案查找$ T( 'misspel MSGID')替换为$ T( '右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);

基本的报价理解将有助于...

$ cmd字符串定义中的\\被PHP占用。

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变量...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM