查找可以被换行符断开的大括号之间的字符串

时间:2014-07-03 13:52:25

标签: regex

目前,我愿意浏览所有项目的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

  1. translate\([\'|"](.*)[\'|"]\)
  2. translate\(\n[[:blank:]]*['|"](.*?)['|"]\n[[:blank:]]*\)
  3. 我有一个问题,但要确定第三种情况,更重要的是要将所有三种情况与一次正则表达式匹配。

    我还尝试了 lookbehind lookahead 语法,例如 (?<=translate\()['|"](.*?)['|"](?=\)) ,当然只匹配第一个案例(没有运气来匹配第二个或第三个案例)。

    是否有人可以分享正确的正则表达式(如果有的话)或至少减少一点光线?

    对于那些问为什么不可能只将一切都放在一行上的人(所以仅以案例1结尾) - 我遵循PHP的PSR-1规范,因此一行最多有120个字符。因此将长字符串拆分为多行。但是如果只有一个简单的正则表达式没有解决方案,我认为我可以暂时打破PSR-1,将所有字符串放入仅与案例1匹配的一行,提取令牌并还原更改。但这需要一些时间才能保存。

    编辑 - 无需添加PHP标记,因为此问题仅与正则表达式相关,与PHP本身无关...

2 个答案:

答案 0 :(得分:2)

您可以使用此PCRE递归正则表达式进行匹配:

'/translate \s* ( \( (?: [^()]* | (?1) )* \) )/x'

Online regex demo

<强>代码:

$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'`