3

我想使用 PHP-Files 搜索特殊函数调用。原因是,我想为 GetText-Extension 生成 .MO-Files。所以我首先需要创建一个 .PO-Files,其中包含所有需要的文本字符串。

我已经找到了很多文本,但是有一些问题。

这是我的正则表达式,用于查找函数调用的第一个参数:

/\_\([\'|\"]{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 回答