PHP复杂的字符串解析

PHP复杂的字符串解析,php,regex,parsing,Php,Regex,Parsing,这可能可以通过正则表达式实现,但我不知道。我试图实现的是能够用给定的分隔符解析字符串,但是当它看到一组括号时,它会以不同的方式解析。因为我是一个视觉学习者,让我给你们展示一个我试图实现的例子。(PS这是从url解析的) 给定字符串输入: String1,String2(data1,data2,data3),String3,String4 如何将此字符串“转换”为此数组: { "String1": "String1", "String2": [ "data1",

这可能可以通过正则表达式实现,但我不知道。我试图实现的是能够用给定的分隔符解析字符串,但是当它看到一组括号时,它会以不同的方式解析。因为我是一个视觉学习者,让我给你们展示一个我试图实现的例子。(PS这是从url解析的)

给定字符串输入:

String1,String2(data1,data2,data3),String3,String4
如何将此字符串“转换”为此数组:

{
    "String1": "String1",
    "String2": [
        "data1",
        "data2",
        "data3"
    ],
    "String3": "String3",
    "String4": "String4
}
格式化不必如此严格,因为我只是尝试为我的项目创建一个简单的API

很明显

数组分解(字符串$delimiter,字符串$string[,int$limit=PHP\u int\u MAX])

不起作用,因为括号内也有逗号。我尝试过一次手动解析每个字符,但我担心性能问题,而且它实际上无法工作。我已粘贴了我尝试的要点


虽然您可以尝试使用逗号拆分初始字符串,并忽略第一次拆分时括号中的任何内容,但这必然会对这些字符串值的实际含义做出假设(可能需要根据这些字符串必须包含的内容进行转义/取消转义)


但是,如果您可以控制数据格式,那么最好从开始。它的定义和支持都很好。

您可以构建一个特殊的解析器,如(大部分未经测试):

(但对于格式不好的字符串,最有可能的失败是可怕的)


或者看看lexer/parser生成器,例如and。

这是一个使用
preg\u match\u all()的解决方案。

图案说明:

([^,(]+)        group 1: any chars except ‘,’ and ‘(’
(\(([^)]+)\))?  group 2: zero or one occurrence of brackets wrapping:
   └──┬──┘
   ┌──┴──┐
   ([^)]+)      group 3: any chars except ‘,’

您可以发布您的输入和所需的输出,以便我们更好地了解您想要实现的目标吗?我发布了给定输入的所需输出您可以为不同级别的字符串子级使用管道/不同的分隔符吗?e、 g.String1、String2(数据1 |数据2 |数据3)、String3、String4I可以。。因为这是一个个人项目,但最好保持他们所有人的分隔符相同。因为当存在级联对象()时,即
字符串(object1、object2(子对象)、object3)
它仍然可以工作,而不需要为每个API使用一个新的分隔符,因此限制了Parsing的数量。我确实考虑过JSON的想法,因为API只以JSON输出。但是为什么您希望使用这种组合语法而不是JSON?基本上URL是这样形成的:
http://example.com/api/contact?_fields=id,职员(第一,最后),然后它输出一个JSON响应。我想我会选择JSON响应,因为它看起来是最完善的,尽管我真的希望URL构造的简单语法被接受,因为这是最早的答案,它们都是很好的答案!谢谢我认为,使用一种已建立的格式,您将更快乐、更高效,而不需要使用自己的解析器(伴随着所有的风险和开销)。这正是我最初试图实现的目标!我注意到的一点是,它只支持一个级别的方括号。请看这里:有没有任何方法可以支持任意数量的级别?嗯。。。我不确定100%,但我认为这是不可能的。。。顺便说一句,我当然不是regex之王,也许其他人可以提供更好的答案。但是,如果你可以访问JSON格式的相同数据,我强烈建议你使用它。是的,我怀疑我是否有过多层括号,如果它没有让URL看起来很糟糕,我会选择JSON,哈哈。。我多么希望我能接受2个答案哈哈
array (
  0 => 'String1',
  'String2' => 
  array (
    0 => 'data1',
    1 => 'data2',
    2 => 'data3',
    'data4' => 
    array (
      0 => 'a',
      1 => 'b',
      2 => 'c',
    ),
  ),
  1 => 'String3',
  2 => 'String4',
)
$string = 'String1,String2(data1,data2,data3),String3,String4,String5(data4,data5,data6)';

$pattern = '/([^,(]+)(\(([^)]+)\))?/';

preg_match_all( $pattern, $string, $matches );

$result = array();
foreach( $matches[1] as $key => $val )
{
    if( $matches[3][$key] )
    { $add = explode( ',', $matches[3][$key] ); }
    else
    { $add = $val; }
    $result[$val] = $add;
}

$json = json_encode( $result );
([^,(]+)        group 1: any chars except ‘,’ and ‘(’
(\(([^)]+)\))?  group 2: zero or one occurrence of brackets wrapping:
   └──┬──┘
   ┌──┴──┐
   ([^)]+)      group 3: any chars except ‘,’