1

我正在开发一个提供与 poEdit 相同功能的 Web 界面。

我想遍历指定文件夹中的所有 .php 文件并搜索每一行以进行翻译。为此,我想使用正则表达式搜索 php 文件中的实际行并返回翻译文本参数和域参数。

我的功能如下所示:

__('This is my translation', 'domain');

但是因为我为域参数定义了一个默认值,所以函数 __() 也可以这样调用:

__('this is my translation');

现在在 PHP 中,我尝试使用函数 preg_match_all() 但我不能将我的正则表达式放在一起。

这是脚本中可能行的示例以及我希望使用 preg_match_all() 函数接收的输出数组:

echo __('Hello World'); echo __('Some domain specific translation', 'mydomain');

数组输出:

Array
(
    [0] => Array
        (
            [0] => Hello World
        )

    [1] => Array
        (
            [0] => Some domain specific translation.
            [1] => mydomain
        )
)

谁能帮我解决正则表达式和 preg_math_all() 标志?

谢谢你们。

4

2 回答 2

1

像这样的东西应该工作。需要数组移位,因为零元素将始终包含完整匹配,因此没有标志可以将其排除在外。

if(preg_match_all('/__\(\s*\'((?:[^\']|(?<=\\\)\')+)\'(?:\s*,\s*\'((?:[^\']|(?<=\\\)\')+)\')?\s*\)/us', $data, $result)) {
  foreach ($result as &$item) {
    array_shift($item);
  }
  unset($item);
  var_dump($result);
}

它会正确找到像这样的调用 __('lorem \' ipsum', 'my\'domain')。但它会在 __('lorem \\') 上失败。

于 2011-12-07T12:40:36.297 回答
1

您需要的正则表达式相当复杂。

__\(\s*(['"])((?:(?!(?<!\\)\1).)+)\1(?:,\s*(['"])((?:(?!(?<!\\)\3).)+)\3)?\s*\)

例如,比赛将在第 2 组和第 4 组中

__('This is my translation', 'domain');

将产生这些组:

  1. '
  2. This is my translation
  3. '
  4. domain

还有这个

__('This is my \'translation\'', "domain");

将产生这些组:

  1. '
  2. This is my \'translation\'
  3. "
  4. domain
于 2011-12-07T12:45:59.043 回答