2013-01-21 73 views
3

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

我已经找到很多文字,但也有一些问题。

这里是我的正则表达式找到一个functioncall的第一个参数:

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

我需要找到函数的调用与以下模式:

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

文本可能包含转义的引号。我的问题是acuallty,我需要知道,如果有一个撇号或用于通话的正常报价。

如果我有电话

_('"text"'); 

然后我得到的问题,我得到的文本

"text 

没有结束的报价。

有没有人有一个想法,我如何让我的正则表达式工作?

+0

您不使用的程序了xgettext收集琴弦任何具体的原因是什么? – hank

+0

你的正则表达式似乎不是有效的。 – nhahtdh

+0

我已经拥有一个包含模板文本的数据库。 Theres也是翻译​​文本的工具。这就是为什么我想要通过这个工具完成所有工作,还有PHP文本。 它实际上运行良好,我只有''文本''字符串的问题..你会改善什么,或什么是无效的? :) –

回答

4

我会使用PHP的tokenizer对于这种东西,不是正则表达式:

$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); 
+0

+1对于更干净的解决方案,但我不知道为什么不从字符串函数名开始 – nhahtdh

+0

没有理由,只是我的选择。 –

2

原始正则表达式:

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

分隔的正则表达式:

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

是在捕获组1.我使用的分支复位图案(?|pattern)使得捕获组数被重置为每个交替的结果分支由|分隔。

里面的分支复位(?|'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)") 2个模式:

  • '((?:[^'\\]|\\.)*)':匹配和单引号字符,它由要么不报价,不反斜杠或转义序列内捕获的内容。实际上,在这里我有点粗心,因为(原始)新行字符被认为是字符串的一部分。我不认为规范会允许这样做,但如果输入包含有效的代码,那么应该没有问题。

  • "((?:[^"\\]|\\.)*)":与上面相同,但对于双引号字符串。

请注意,我不会使用该函数的其余参数。

+0

工程实际上很好,但是当我有字符串“hallo 文字”它被拆分后\ –

+0

@KevinGlier:固定。 – nhahtdh

+0

它现在似乎完美地工作。但是,我得到了错误“编译失败:缺少终止”字符类的偏移量为51英寸..“,所以我加了两个更多的反斜杠。它知道如下:preg_match_all('〜_ \((?| \'((?:[^ \'\\\] | \\。)*)\'|“((?:[^”\\ \] | \\。)*)“)〜',...); –

相关问题