我想提取函数的第一个和第二个参数(如果有的话)。
例如,从__('param1', 'param2')
开始,我想提取param1
和param2
。
这是我觉得棘手的事情:
想要提取参数的一些潜在情况:
__('My test')
__('Uber test', 'dan')
__("test t'fdgfgd")
__("test t'dfgdgf","fgf', 'dgfdg")
答案 0 :(得分:1)
你说得对,这有点棘手,但这很有效(请参阅demo所有例子):
(?:__\(|\G['"]\s*,\s*)(['"])\K.*?(?=(?<!\\)\1)
@NiettheDarkAbsol提到了转义引号的可能性,所以我为棘手的字符串添加了条件,例如:
__('My \'test')
__("My \"test")
这是如何运作的?
对于逐个令牌的解释,这有点长,但是......
(?:__\(|\G['"]\s*,\s*)(['"])\K
将我们置于开场报价之内,由于“\K
博士”,他们放弃了迄今为止所匹配的内容。回到这个。.*?
懒惰地匹配字符...... (?=(?<!\\)\1)
可以断言后面的内容与开头引号(\1
反向引用)相同的字符,只要它没有前面的转义反斜杠({ {1}})(?<!\\)
eep out”之前,我们要么匹配开头\K
,要么匹配由__\(
捕获的开始字符串,以确保结束字符串相同({{1}稍后参考)......或...... (['"])
断言我们位于上一个匹配的最后一个字符之后,\1
匹配它的结束引号,然后是逗号(由可选空格包围),然后是一个开头字符串,由{ {1}}以确保结束字符串相同(稍后\G
引用)。这就是它的全部内容!
答案 1 :(得分:0)
这是一个可以给你匹配的正则表达式:
(?:(?:')((?:(?!(?<!\\)').)+)(?:'(?:,\s*)?))|(?:(?:")((?:(?!(?<!\\)").)+)(?:"(?:,\s*)?))