Php 提取嵌套元素的正则表达式

Php 提取嵌套元素的正则表达式,php,regex,nested,Php,Regex,Nested,我有一个包含以下结构的文本文档 {1,"StructEx", [{1,"Element_1",[{2,"name","exampleName"},{3,"exampleValue",1},{2,"exampleComment","foo"}]}, [{1,"Element_2",[{2,"name","exampleName2"},{3,"exampleValue",2},{2,"exampleComment","bar"}]}]} 其中括号中的第一个值是数据类型。 我需要返回的正则表达式(通

我有一个包含以下结构的文本文档

{1,"StructEx",
[{1,"Element_1",[{2,"name","exampleName"},{3,"exampleValue",1},{2,"exampleComment","foo"}]},
[{1,"Element_2",[{2,"name","exampleName2"},{3,"exampleValue",2},{2,"exampleComment","bar"}]}]}
其中括号中的第一个值是数据类型。 我需要返回的正则表达式(通过两次迭代) StructEx中的所有元素,这样我就可以将其打包成这样

["StructEx"]=>
array(2) {
["Element_1"]=>
array(3) {
  ["name"]=>
  string(11) "exampleName"
  ["exampleValue"]=>
  int(1)
  ["exampleComment"]=>
  string(3) "foo"
}
["Element_2"]=>
array(3) {
  ["name"]=>
  string(12) "exampleName2"
  ["exampleValue"]=>
  int(2)
  ["exampleComment"]=>
  string(3) "bar"
}
}

假设嵌套是任意深度的,那么答案是否,您不能用正则表达式解析这种文本文档。如果深度是有限的,这是痛苦的,但可行的

这到底是为什么? 字母表 为了更详细地回答你的问题,让我们介绍一些很棒的枯燥理论

让我们将字母∑定义为一组非空的符号(一个更技术上正确的定义来自范畴理论,它将字母视为非空的自由对象,但为了论证起见,这个定义就足够了)

在字母表∑中,我们可以定义字母表上所有有限字符串(读:单词)的集合,即:

∑={s1,s2,…,sn}

∑*={ε}∪ {si1si2…sim|sik∈ ∑,m>0,1≤ K≤ n} ,其中ε为空字符串

作为一个例子,这意味着如果我们有一个字母表,
a,b,c}
,∑*中的一些单词将是
aaaaaa
ababababab
,而不是
abd
,因为我们甚至不知道
d
的存在

正则表达式与语言 给定字母∑,我们有像
ab*| c
这样的正则表达式。我跳过正则表达式的正式定义,以减少混淆,所以让我们假设它是我们的普通老“实用”正则表达式

每个正则表达式定义一种正则语言,例如,在本例中,该语言由单词
a
ab
c
abbbbc
,而不是
abc
组成

有限自动机 每种正则语言都可以表示为,一种可以识别正则表达式的设备。对于前面提到的正则表达式
ab*| c
,自动机如下所示:

0是开始状态,双圈是接受状态。简言之,自动机在状态0中开始使用单词的每个字母,并根据转换箭头移动。如果它最终处于接受状态,则表示它接受字符串。否则,表示它拒绝字符串

因此,在本例中,将字符串
abb
送入我们的机器:

  • 从状态0开始
  • 消费
    a
    ,移动到状态1
  • 消费
    b
    ,移动到状态3
  • 消费
    b
    ,移动到状态3
  • 字符串为空,状态3为接受状态,因此这台机器接受字符串,或者等效地,我们的正则表达式模式匹配字符串
  • 让我们看看将
    abc
    输入机器时会发生什么:

  • 从状态0开始
  • 消费
    a
    ,移动到状态1
  • 消费
    b
    ,移动到状态3
  • 消费
    c
    ,无处移动,字符串被拒绝
  • 因此,我们的正则表达式与abc不匹配。所有这些基本上与实际正则表达式相同,只是添加了一些理论

    等值 有一个定理表明,每种正则语言都是可识别的有限自动机。这意味着,如果存在一种正则语言(以及底层正则表达式)可以匹配您所需的模式,那么应该存在一个等价的有限自动机

    那么,为什么不呢? 但是,模式中的嵌套具有无限的深度,因此,您需要一个无限大的有限自动机,该自动机等价于正则语言,这与有限自动机的定义相矛盾

    参考文献
  • 免责声明
    正如你所看到的,我跳过了正则表达式的归纳定义,从范畴论的角度来看的有限自动机,操作下的闭包,以及一些其他形式的东西。欢迎你在前面提到的参考链接中阅读这些内容。

    这些数据从何而来?看起来半纵火的jsonA正则表达式可能不是最好的方法:它'd可能比更合适的解析器慢。你能使用准JSON解析器吗?你能转换一些字符并用python阅读吗?很好。但展示你的尝试!纯regexp不是递归的。有一些扩展是递归的,但它是真正需要使用的。将格式更改为JSON是一个选项吗?这个问题真的是针对一个问题吗或者你打算用什么方法来解决这个问题?