2014-10-05 49 views
0

我已经创建了一个Language类,它在通过函数传递时自动转换字符串。我现在正在研究一个工具,该工具将允许我提取所有这些文本片段并将它们保存到可单独翻译的文件中,尽管我在使用正则表达式时只是将引号内的文本与匹配的文本相匹配。 HTML的正则表达式preg_match_all在特定函数之间

实施例:

<h1><?=$Lang->t("Example text")?></h1> 
<h1><?=$Lang->t("Example (text)")?></h1> 
<h1><?=$Lang->t("Example %s", 'text')?></h1> 

的输出示例:

Example text 
Example (text) 
Example %2 

在第三示例中传递的参数应排除仿如所示在最后一个例子输出

注:这应该忽略可能在任何页面上的所有其他内容,例如javascript,jQuery,Php等等。

有没有人可以对此有所了解? :)

回答

0

一个快速和肮脏的解决办法是这样的表达式:

$re = <<<'re' 
    /
     \$Lang->t\(
      (
       " ((?: \\. | [^"])*) " 
       | 
       ' ((?: \\. | [^'])*) ' 
      ) 
    /x 
re; 

基本上匹配$Lang->t(后跟单或双引号内的字符串,相对于逸出。用法如下:

$code = <<<'eof' 
<h1><?=$Lang->t("Example text")?></h1> 
<h1><?=$Lang->t("Example (text)")?></h1> 
<h1><?=$Lang->t("Example %s", 'text')?></h1> 
<h1><?=$Lang->t("Example\"foo\"", 'text')?></h1> 
<h1><?=$Lang->t('Example\'foo\'', 'text')?></h1> 
eof; 

preg_match_all($re, $code, $m, PREG_SET_ORDER); 
print_r(array_map('end', $m)); 

这不是防弹的正则表达式不能完全解析的编程语言,而是将工作在大多数情况下的罚款。

+0

感谢您的回复!是的,这正是我需要的,我试过你的正则表达式(我只想要双引号方法)我已经试过了:$ re =“<< <'re'\$Lang-> t \((\”((?:\\。| [^ \“] )*)\“)/ x re;”;但是我每次尝试它,我都会遇到php错误,任何想法? – 2014-10-05 16:21:07