使用参数提取函数调用

时间:2018-07-29 21:22:55

标签: php regex pcre

我有一个翻译功能,想用正则表达式列出所有带名称空间的翻译。

到目前为止我想到的最好的事情是:

translate[\s]*\((?|'([^']*?(?:\\'|)[^']*?)'|"([^"]*?(?:\\"|)[^"]*?)")(?:|[, ]*(?:'|")(.*?)(?:"|'))\)

但是,对于我的regEx技能而言,([^']*?(?:\\'|)[^']*?)部分太难了。有帮助吗?

找不到任何匹配排除序列\'的方法。

translate('hello what\'s wrong');
translate('hello what\'s wrong');
translate('hello what\'s wrong');
translate("hello what's w: )rong");
translate("hello whats wrong");
translate('hello what\'s wrong');

translate('hello what\'s wrong', 'namespace');
translate('hell\'o what\'s wro\'ng', 'namespace');
translate("hello what\"s \" s\" wrong", 'namespace');
translate('hell(o) (wh)at\'s wrong', "namespace");
translate("hello what's wrong", "namespace");

translate  ('hello what\'s wrong');
translate("hel
lo what's wrong");

translate('hello what\'s wrong', 'namespace');
translate("hello wh
at's wrong", 'namespace');
translate('hello what\'s wrong', "namespace");
translate("hello what's wrong", "namespace");

translate[\s]*\((?|(?:')([^']*?(?:\\'|)[^']*?)(?:')|(?:")([^"]*?(?:\\"|)[^"]*?)(?:"))(?:|[, ]*(?:'|")(.*?)(?:"|'))\)

为便于调试,无法运行的https://regex101.com/r/8Jzso3/4

PS:我可能已经使所有这些小组变得过于复杂了。

1 个答案:

答案 0 :(得分:1)

要匹配所有测试字符串,我想您要做的就是*重复开头'和结尾'或开头{{1 }}和结尾的"(与未转义的引号匹配的组最多为一个转义的"\')。将重复的组变成一​​个非捕获组,然后在重复的组周围使用另一个组来捕获参数字符串中外引号之间的所有内容。

您还可以将\"简化为translate[\s]*,因为该字符集中只有一个字符。

translate\s*

https://regex101.com/r/8Jzso3/6