Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何提取复杂字符串中的参数_Php_Regex_Wordpress - Fatal编程技术网

Php 如何提取复杂字符串中的参数

Php 如何提取复杂字符串中的参数,php,regex,wordpress,Php,Regex,Wordpress,我想提取函数的第一个和第二个参数(如果有) 例如,我想从\uuu('param1','param2')中提取param1和param2 以下是我发现的棘手问题: 可能没有第二个参数 参数引号可以是单引号或双引号 双引号参数可以包含单引号,反之亦然 需要提取参数的一些潜在情况: __('My test') __('Uber test', 'dan') __("test t'fdgfgd") __("test t'dfgdgf","fgf', 'dgfdg") 这是。你是对的,这有点棘手,但这是可

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

例如,我想从
\uuu('param1','param2')
中提取
param1
param2

以下是我发现的棘手问题:

  • 可能没有第二个参数
  • 参数引号可以是单引号或双引号
  • 双引号参数可以包含单引号,反之亦然
  • 需要提取参数的一些潜在情况:

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

    这是。

    你是对的,这有点棘手,但这是可行的(请参阅所有示例):

    这是如何工作的?

    这对于一个令牌一个令牌的解释来说有点长,但是

  • 这部分
    (?:uu\(| G['']\s*,\s*)(['''])\K
    将我们定位在开盘报价中,由于“Dr.
    \K
    eep out”,我们放弃了迄今为止匹配的内容。稍后再回到这里
  • *?
    惰性地匹配最多
  • 向前看
    (?=(?)可以断言后面的字符与开头引号(
    \1
    反引用)相同,只要前面没有转义反斜杠(
    (?)
  • 好的,第1部分是如何工作的?在“Dr.
    \K
    eep out”之前,我们要么匹配开头的
    \uuu\(
    ),然后匹配一个开头的字符串,由
    ([“])
    捕获,以确保结尾的字符串是相同的(后面的
    \1
    引用)…或者
  • \G
    声明我们位于前一个匹配的最后一个字符之后,
    ['”]\s*,\s*
    匹配它的结束引号,然后是逗号(由可选空格包围),然后是开头字符串,由
    (['”])
    捕获,以确保结束字符串是相同的(后面的
    \1
    引用)

  • 这就是它的全部内容!

    这里有一个正则表达式可以为您提供匹配项:

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

    <(?):(?):(?):(?)(这个句柄如何逃出引号?@ NeTeTyDakabsOL,你是对的,虽然这不是规范,这是一个重要的情况。完成。谢谢!):用正则表达式解析编程语言在大多数情况下是一个无望的企业。考虑一个合适的解析器(例如)。
    __('My \'test')
    __("My \"test")
    
    (?:(?:')((?:(?!(?<!\\)').)+)(?:'(?:,\s*)?))|(?:(?:")((?:(?!(?<!\\)").)+)(?:"(?:,\s*)?))