目前,我愿意浏览所有项目的PHP文件,并从源代码中提取一些语言标记,为翻译人员提供这些标记(是的,它们的列表同时更新,但事实上很少有令牌被遗漏)。
语言字符串可以在以下所有情况下编写:
的 1。单行
translate('THIS IS MY LANGUAGE TOKEN I NEED TO EXTRACT')
2。令牌在换行
translate(
'THIS IS MY LANGUAGE TOKEN I NEED TO EXTRACT'
)
第3。令牌处于换行符并按换行符分组
translate(
'THIS IS '
. 'MY LANGUAGE TOKEN '
. 'I NEED TO EXTRACT'
)
我提出了2个正则表达式,首先匹配案例1,第二个匹配案例2,两者都完全返回THIS IS MY LANGUAGE TOKEN I NEED TO EXTRACT
:
translate\([\'|"](.*)[\'|"]\)
translate\(\n[[:blank:]]*['|"](.*?)['|"]\n[[:blank:]]*\)
我有一个问题,但要确定第三种情况,更重要的是要将所有三种情况与一次正则表达式匹配。
我还尝试了 lookbehind 和 lookahead 语法,例如 (?<=translate\()['|"](.*?)['|"](?=\))
,当然只匹配第一个案例(没有运气来匹配第二个或第三个案例)。
是否有人可以分享正确的正则表达式(如果有的话)或至少减少一点光线?
对于那些问为什么不可能只将一切都放在一行上的人(所以仅以案例1结尾) - 我遵循PHP的PSR-1规范,因此一行最多有120个字符。因此将长字符串拆分为多行。但是如果只有一个简单的正则表达式没有解决方案,我认为我可以暂时打破PSR-1,将所有字符串放入仅与案例1匹配的一行,提取令牌并还原更改。但这需要一些时间才能保存。
编辑 - 无需添加PHP标记,因为此问题仅与正则表达式相关,与PHP本身无关...
答案 0 :(得分:2)
您可以使用此PCRE递归正则表达式进行匹配:
'/translate \s* ( \( (?: [^()]* | (?1) )* \) )/x'
<强>代码:强>
$re = "/translate \s* ( \( (?: [^()]* | (?1) )* \) )/x";
if (preg_match_all($re, $input, $matches))
print_r($matches);
答案 1 :(得分:1)
尝试以下正则表达式模式并获取索引1处的匹配组。正则表达式模式返回(...)
中包含的所有内容,然后翻译。
/translate\(\s*('[^\)]*')\s*\)/g
注意:根据需要更改正则表达式。如果您不希望单引号成为组匹配的一部分,请将其移到括号外。
以下是regex101
上的演示输出:
MATCH 1
1. [10-55] `'THIS IS MY LANGUAGE TOKEN I NEED TO EXTRACT'`
MATCH 2
1. [73-118] `'THIS IS MY LANGUAGE TOKEN I NEED TO EXTRACT'`
MATCH 3
1. [137-200] `'THIS IS ' . 'MY LANGUAGE TOKEN ' . 'I NEED TO EXTRACT'`