【问题标题】:Regular Expression filtering all translation functions正则表达式过滤所有翻译函数
【发布时间】:2012-01-14 23:06:06
【问题描述】:

我正在开发一个提供与 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() 标志?

谢谢你们。

【问题讨论】:

  • 澄清一下 - 您希望从 __() 函数调用的 all 中删除第二个参数?
  • 你应该避免命名一个函数 __ iirc 以 __ 开头的函数、类等名称被认为是为 php 开发人员保留的。

标签: php regex gettext poedit


【解决方案1】:

这样的事情应该可以工作。需要数组移位,因为零元素将始终包含完全匹配,AFAIK 没有标志来排除它。

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 \\') 上失败。

【讨论】:

  • 如果我将正则表达式粘贴到正则表达式测试器中,正则表达式本身会完全满足我的需要,但如果我尝试在我的 php 中实现您的代码,则会出现以下错误:Warning: preg_match_all(): Compilation failed: nothing to repeat at offset 25。有什么想法吗?
  • @Spinnenzunge 在 PHP 中声明正则表达式字符串时,您使用单引号还是双引号?您是否使用 / 作为正则表达式分隔符?
  • 我完全复制/粘贴了您发布的内容。可以通过在(?&lt;=\\) 上添加一个额外的反斜杠来解决问题。
  • 哦,没错。抱歉,忘记了那个。现在编辑我的答案。
  • 附加问题:如果我想用单引号和双引号来调用函数参数,比如__("This is my translation", "mydomain"),我需要添加什么?
【解决方案2】:

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

__\(\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

【讨论】:

  • 我忘记了双引号。真丢人。
  • @Nameless:但我发现伟大的思想是相似的。 +1 为您的正则表达式。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多