Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.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_Preg Match - Fatal编程技术网

Php 来自字符串的正则表达式顶级内容

Php 来自字符串的正则表达式顶级内容,php,regex,preg-match,Php,Regex,Preg Match,请帮忙,我的正则表达式技能让我失望。我有以下字符串: username|email_address|phone_numbers[number]profile[title|addresses[id]] 我希望能够提取方括号中的任何数据,但不希望该数据是已提取集的子集。因此,任何嵌套都应该作为父级提取字符串的一部分保留 在上面的示例中,我提取了两个部分: "number" "title|addresses[id]" 请注意[id]是如何被提取的,因为它是较低级别数据集的一部分 我一直试图用pre

请帮忙,我的正则表达式技能让我失望。我有以下字符串:

username|email_address|phone_numbers[number]profile[title|addresses[id]]
我希望能够提取方括号中的任何数据,但不希望该数据是已提取集的子集。因此,任何嵌套都应该作为父级提取字符串的一部分保留

在上面的示例中,我提取了两个部分:

"number"
"title|addresses[id]"
请注意[id]是如何被提取的,因为它是较低级别数据集的一部分


我一直试图用preg_match来实现这一点,但我想我可能不得不对字符串中的每个字符进行迭代。

一个令人遗憾的事实是,正则表达式无法处理括号匹配,因为正则表达式没有内存。(相当于)

要实现您想要的,您必须自己编写一个小型解析器(我认为),使用堆栈可以解决这个问题;)

使用堆栈解决问题的基本思想是。。每次你看到一个[你会推堆栈,每次你看到一个]你会弹出堆栈并收回你从[你上次看到的]以来得到的字符串


希望这能有所帮助;)

我编写了一个小型解析器来实现所需的结果:

代码:

$data = 'username|email_address|phone_numbers[number]profile[title|addresses[id]wut]aaa[another test] aaand another one [which is [more] c[omplexer]t[h[an]] the others]';
print_r(parse($data));

function parse($string, $s1='[', $s2=']'){
    $c1 = $c2 = 0;$s = 1;
    $l = strlen($string);
    $array = array(array(), array());
    for($i=0;$i < $l;$i++){
        if($string[$i] == $s1){
            $c1++;
            $array[0][$c1] = $i;
        }elseif($string[$i] == $s2){
            $c2++;
            $array[1][$c2] = $i;
            if($c1 == $c2){
                $results[] = substr($string, $array[0][$s], $array[1][$c2] - $array[0][$s] + 1);
                $s=$c1+1;
            }
        }
    }
    return $results;
}
Array
(
    [0] => [number]
    [1] => [title|addresses[id]wut]
    [2] => [another test]
    [3] => [which is [more] c[omplexer]t[h[an]] the others]
)

这里有一个正则表达式解决方案:

preg_match_all(
    '/(?<=\[)     # Assert that the previous characters is a [
      (?:         # Match either...
       [^[\]]*    # any number of characters except brackets
      |           # or
       \[         # an opening bracket
       (?R)       # containing a match of this very regex
       \]         # followed by a closing bracket
      )*          # Repeat as needed
      (?=\])      # Assert the next character is a ]/x', 
    $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
preg\u match\u all(

“/(?这是非常奇怪的格式数据。它从哪里来?是的,您必须迭代字符串(或以其他方式解析它)因为正则表达式不能匹配大括号对,更不用说嵌套了ones@Bojangles:当然可以。正则表达式不再局限于常规语言。几十年来,正则表达式不再局限于常规语言,人们仍在不断兜售古老的神话“正则表达式不能处理嵌套”…@Tim你能举个例子吗?在我的快速研究中,我发现.NET可以做到这一点,但由于正则表达式被表示为一个没有内存的有限自动机,其他任何东西都不能做到这一点state@Bojangles:我的答案将是一个示例,包含更多信息。“常规”表达式不能。PHP的正则表达式风格可以使用
(?R)
很好地处理递归。