3

PHP-Filesで特別な関数呼び出しを検索したい。その理由は、GetText-Extension用の.MOファイルを生成したいからです。したがって、最初に、必要なすべてのテキスト文字列を含む.POファイルを作成する必要があります。

私はすでにたくさんのテキストを見つけましたが、いくつかの問題があります。

関数呼び出しの最初の引数を見つけるための私の正規表現は次のとおりです。

/\_\([\'|\"]{1}(.+?[^\\\])[\'|\"]{1}[,]{0,1}.*?\)+/si

次のパターンの関数呼び出しを見つける必要があります。

_("text");
_("text %s", 3);
_('text');

テキストには、エスケープされた引用符を含めることができます。私の問題は、アポストロフィまたは通常の引用符が呼び出しに使用されたかどうかを知る必要がある、鋭敏さです。

電話があれば

_('"text"');

それから私は問題を取得します、それは私がテキストを取得します

"text

終了引用符なし。

誰かがアイデアを持っていますか、どうすれば正規表現を機能させることができますか?

4

2 に答える 2

4

この種のものには、正規表現ではなく、PHPのトークナイザーを使用します。

$funcName = '_';
$tokens   = token_get_all(file_get_contents('path/to/your/script.php'));
$strings  = array();

foreach($tokens as $index => $token){

  if(!is_array($token))
    continue;

  if($token[0] === T_CONSTANT_ENCAPSED_STRING){

    if(!isset($tokens[$index - 2]) || ($tokens[$index - 1] !== "("))
      continue;

    list($id, $text, $line) = $tokens[$index - 2];

    // this is your string (substr drops quotes around it)
    if(($id === T_STRING) && ($text === $funcName))
      $strings[] = substr($token[1], 1, -1);

  }    
}

var_dump($strings);
于 2013-01-21T12:08:35.427 に答える
2

生の正規表現:

_\((?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)")

区切られた正規表現:

~_\((?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)")~

結果はキャプチャグループ1になります。ブランチリセットパターンを使用(?|pattern)して、キャプチャグループ番号が。で区切られた交互のブランチごとにリセットされるようにしました|

ブランチリセットの内部に(?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)")は2つのパターンがあります。

  • '((?:[^'\\]|\\.)*)':単一引用符で囲まれた文字列内のコンテンツを照合してキャプチャします。これは、引用符なし、バックスラッシュなし、またはエスケープされたシーケンスのいずれかで構成されます。実際、ここでは(生の)改行文字が文字列の一部と見なされるため、少し不注意です。仕様でこれが許可されるとは思いませんが、入力に有効なコードが含まれていれば問題はありません。

  • "((?:[^"\\]|\\.)*)":上記と同じですが、二重引用符で囲まれた文字列の場合です。

関数の残りの引数は使用しないことに注意してください。

于 2013-01-21T12:00:42.893 に答える