如何在棘手的字符串中提取参数

时间:2014-06-11 09:44:43

标签: php regex wordpress

我想提取函数的第一个和第二个参数(如果有的话)。

例如,从__('param1', 'param2')开始,我想提取param1param2

这是我觉得棘手的事情:

  1. 可能没有第二个参数
  2. 参数引号可以是简单引号或双引号
  3. 双引号参数可能包含单引号,反之亦然。
  4. 想要提取参数的一些潜在情况:

    __('My test')
    __('Uber test', 'dan')
    __("test t'fdgfgd")
    __("test t'dfgdgf","fgf', 'dgfdg")
    

    这是what I have tried

2 个答案:

答案 0 :(得分:1)

你说得对,这有点棘手,但这很有效(请参阅demo所有例子):

(?:__\(|\G['"]\s*,\s*)(['"])\K.*?(?=(?<!\\)\1)

@NiettheDarkAbsol提到了转义引号的可能性,所以我为棘手的字符串添加了条件,例如:

__('My \'test')
__("My \"test")

这是如何运作的?

对于逐个令牌的解释,这有点长,但是......

  1. 这部分(?:__\(|\G['"]\s*,\s*)(['"])\K将我们置于开场报价之内,由于“\K博士”,他们放弃了迄今为止所匹配的内容。回到这个。
  2. .*?懒惰地匹配字符......
  3. 前瞻(?=(?<!\\)\1)可以断言后面的内容与开头引号(\1反向引用)相同的字符,只要它没有前面的转义反斜杠({ {1}})
  4. 好的,第1部分是如何工作的?在“Dr. (?<!\\) eep out”之前,我们要么匹配开头\K,要么匹配由__\(捕获的开始字符串,以确保结束字符串相同({{1}稍后参考)......或......
  5. 使用(['"])断言我们位于上一个匹配的最后一个字符之后,\1匹配它的结束引号,然后是逗号(由可选空格包围),然后是一个开头字符串,由{ {1}}以确保结束字符串相同(稍后\G引用)。
  6. 这就是它的全部内容!

答案 1 :(得分:0)

这是一个可以给你匹配的正则表达式:

(?:(?:')((?:(?!(?<!\\)').)+)(?:'(?:,\s*)?))|(?:(?:")((?:(?!(?<!\\)").)+)(?:"(?:,\s*)?))

Demo