什么是最好的正则表达式模式,可以捕获包含在 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 案例构建模式。只需评论或发消息给我,我会提供帮助。
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 案例构建模式。只需评论或发消息给我,我会提供帮助。