任何人都可以帮我解决正则表达式问题。我制作一个脚本来浏览我所有的.php文件并将所有字符串传递给某个函数。我需要匹配这些案例:
/* Double quotes */
function("some string"); // Match: some string
function("some \"string\""); // Match: some "string"
function("some 'string'"); // Match: some 'string'
/* Single quotes */
function('some string'); // Match: some string
function('some \'string\''); // Match: some 'string'
function('some "string"'); // Match: some "string"
函数也可以在字符串后接受参数,因此它也需要匹配这些情况:
/* Additional parameters */
function("some string", "param"); // Match: some string
function("some string", $param); // Match: some string
基本上,param可以是字符串(带引号或双引号)或不带引号的变量。 我需要从函数的第一个参数获取字符串,无论第二个参数是否存在或以任何方式引用...
提前致谢...
答案 0 :(得分:0)
这是一个快速草图,可能有助于您入门:
while (readline) {
my ($matched) = m{
\b function \s* \( \s*
(
" (?: [^"\\] | \\ .)* "
|
' (?: [^'\\] | \\ .)* '
)
}sx or next;
my $value = php_unescape $matched; # XXX: write me
print $value, "\n";
}
答案 1 :(得分:0)
您的特定示例已成功处理...
preg_match_all('#\\(\\s*("((\\\\.|[^"])+)"|\'((\\\\.|[^\'])+)\'),?#s', $test, $matches);
此处ideone demo。
说明:我们尝试匹配左括号(幸运的是,它的PHP;它在Ruby中要困难得多),其次是任意数量的空白字符,后跟...
"(\\.|[^"])+"
'(\\.|[^'])+'
...后跟可选的逗号。
这些序列中的每一个都涵盖了两个特殊字符' (用斜线逃脱)和正常的' (与分隔符不同)。
答案 2 :(得分:0)
不是使用正则表达式(你自己),而是可以使用一个php解析器来提供某种AST,例如在Generate AST of a PHP source file
接受的答案<?php
require 'path/to/PHP-Parser-master/lib//bootstrap.php';
class MyNodeVisitor extends PHPParser_NodeVisitorAbstract
{
public function beforeTraverse(array $nodes) {}
public function enterNode(PHPParser_Node $node) { }
public function leaveNode(PHPParser_Node $node) {
if ($node instanceof PHPParser_Node_Expr_FuncCall) {
if ( 'foo'===(string)$node->name ) {
foreach( $node->args as $arg ) {
echo $arg->value->value, "\n";
}
}
}
}
public function afterTraverse(array $nodes) {}
}
$parser = new PHPParser_Parser(new PHPParser_Lexer);
$nv = new MyNodeVisitor;
$traverser = new PHPParser_NodeTraverser;
$traverser->addVisitor($nv);
try {
$stmts = $parser->parse( data() );
$stmts = $traverser->traverse($stmts);
} catch (PHPParser_Error $e) {
echo 'Parse Error: ', $e->getMessage();
}
function data() {
return <<< eot
<?php
/* Double quotes */
foo("some string"); // Match: some string
foo("some \"string\""); // Match: some "string"
foo("some 'string'"); // Match: some 'string'
/* Single quotes */
foo('some string'); // Match: some string
foo('some \'string\''); // Match: some 'string'
foo('some "string"'); // Match: some "string"
eot;
}
打印
some string
some "string"
some 'string'
some string
some 'string'
some "string"
答案 3 :(得分:0)
我在sed
写了一个脚本。将其保存在文件file.sed
bs
:gf
s:,.*$::
s:^.::
s;.$;;
s:[\]\(["']\):\1:g
p;d
:s
/.*(\([^)]*\).*/ s::\1:
tgf
d
接下来,运行它sed -f file.sed FILE.py
:
for x in `find -name \*.py`; do sed -f file.sed $x; done
编辑:
可以使用oneliner sed命令替换脚本,但调用它以便调试它的功能非常清楚。