什么是最好的正则表达式模式,可以捕获包含在 gettext 函数中的 .php 页面中的所有文本(下面的示例)

What is the best Regex pattern that would catch all text in a .php page that is wrapped within a gettext function (examples below)

php 页面中可能包含一些代码,其中有一些变化(从最重要到最不重要),应该考虑在内:

 <p><?= $translator->gettext('string example') ?></p>
 <p><?= sprintf($translator->gettext("string example n2"), Dave) ?></p>
 <p><?= $translator->ngettext('string example', 'string examples', 2) ?></p>
 <p><?= sprintf($translator->ngettext("string example n2", "string examples n2", 2), 2) ?></p>
 <p><?= $translator->pgettext('Context1', 'string example') ?></p>
 <p><?= translator->npgettext('Context2', 'string example', 'string examples', 2) ?></p>

理想情况下,预期输出应如下所示:

array(2) {
  [0]=>
  array(4) {
    [0]=> string(44) "<?= $translator->gettext('string example') ?>"
    [1]=> string(44) "<?= $translator->gettext('string example n2') ?>"
    [2]=> string(44) "<?= $translator->ngettext('string example', 'string examples', 2) ?>"
    [3]=> string(44) "<?= $translator->ngettext('string example n2', 'string examples n2', 2) ?>"
    [4]=> string(44) "<?= $translator->pgettext('Context1', 'string example') ?>"
    [5]=> string(44) "<?= $translator->npgettext('Context2', 'string example', 'string examples', 2) ?>"
  }
  [1]=>
  array(4) {
    [0]=> array(1) { [0]=> string(13) "string example" }
    [1]=> array(1) { [0]=> string(13) "string example n2" }
    [2]=> array(2) { 
          [0]=> string(13) "string example" 
          [1]=> string(13) "string examples"
        }
    [3]=> array(2) { 
          [0]=> string(13) "string example n2" 
          [1]=> string(13) "string examples n2"
        }
    [4]=> array(1) { 
          [0]=> string(13) "Context1" 
          [1]=> string(13) "string example"
        }
    [5]=> array(2) { 
          [0]=> string(13) "Context2" 
          [1]=> string(13) "string example"
          [2]=> string(13) "string examples"
        }
  }
}

基本上第一个数组将具有上下文以了解哪个 gettext 函数正在包装文本。第二个数组只是包装文本。以便它可以用于自动翻译。

目前,这是我尝试过的方法:

preg_match_all('/<\?= $translator->gettext\(\'([^\']+)\'\) \?>/', $contents, $matches, PREG_PATTERN_ORDER);

但这种模式只让我得到了第一个实例:<p><?= $translator->gettext('string example') ?></p> 并想念所有其他人。

编辑:另外,如果正则表达式不能解决这个问题,那还有什么可以呢?

正则表达式可以很好地完成这项工作。以下是前两种情况的模式:

获取文本:

preg_match_all('/$translator\s*->\s*gettext\s*\(\s*(\"([^\"]+)\"|\'([^\']+)\'\s*)\)/', $contents, $gettextMatches, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE );

ngettext :

preg_match_all('/$translator\s*->\s*ngettext\s*\(\s*(\"([^\"]+)\"|\'([^\']+)\')\s*,\s*(\"([^\"]+)\"|\'([^\']+)\')\s*,\s*\.*([^\)]+\s*)\)/', $contents, $ngettextMatches, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);

输出需要根据需要进行格式化。如果有人需要但不知道如何构建,我可以为 pgettext 或 npgettext 案例构建模式。只需评论或发消息给我,我会提供帮助。