0

誰かが正規表現の問題で私を助けることができますか?すべての.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は文字列(引用符付きまたは二重引用符付き)または引用符で囲まれていない変数のいずれかになります。2番目のパラメーターが存在するか、何らかの方法で引用されているかに関係なく、関数の最初のパラメーターからのみ文字列を取得する必要があります...

前もって感謝します...

4

4 に答える 4

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

編集:

スクリプトをonelinersedコマンドに置き換えることもできますが、スクリプトを呼び出すと、スクリプトの動作をデバッグするのが非常に明確になります。

于 2012-12-21T14:27:55.863 に答える
0

これがあなたが始めるのを助けるかもしれない簡単なスケッチです:

while (readline) {
    my ($matched) = m{
        \b function \s* \( \s*
        (
            " (?: [^"\\] | \\ .)* "
        |
            ' (?: [^'\\] | \\ .)* '
        )
    }sx or next;
    my $value = php_unescape $matched; # XXX: write me
    print $value, "\n";
}
于 2012-12-21T13:56:10.580 に答える
0

あなたの特定の例は...で正常に処理されました

preg_match_all('#\\(\\s*("((\\\\.|[^"])+)"|\'((\\\\.|[^\'])+)\'),?#s', $test, $matches);

これがideoneのデモです。

説明:開き括弧(ありがたいことに、PHPです。Rubyでははるかに難しいでしょう)、任意の数の空白文字、...

  • また"(\\.|[^"])+"
  • また'(\\.|[^'])+'

...その後にオプションのコンマが続きます。

この各シーケンスは、「特殊文字」(スラッシュでエスケープ)と「通常の文字」(区切り文字とは異なります)の両方をカバーします。

于 2012-12-21T14:02:57.530 に答える
0

正規表現(自分自身)を使用する代わりに、ある種のASTを提供するphpパーサーを使用できます。たとえば、PHPソースファイルの[ASTの生成]で回答として受け入れられたものです。

<?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"
于 2012-12-21T14:17:09.597 に答える