0

我想将以下字符串转换为数组

[地图]id=map,size=512x512,markers=[[latitude=40.5,longitude=-73.9],[latitude=41.5,longitude=-72.9]][/map]

我想使用逗号作为分隔符,但前提是它们不位于 [ 和 ] 字符之间。

因此,上面的字符串将被转换为:

  • [0] => id=地图,
  • [1] => 尺寸=512x512,
  • [2] => 标记=[[纬度=40.5,经度=-73.9],[纬度=41.5,经度=-72.9]]

实现这一目标的最简单方法是什么?

我已经研究过使用函数 str_getcsv 但这似乎只有在整个部分都在传递的外壳内时才有效。

任何建议表示赞赏。

谢谢。

4

1 回答 1

3

您可能需要编写自己的解析器来完成这项工作,让我们假设您有这样的字符串:(为了更短的示例而id=map,size=512x512,markers=[[latitude=40.5,longitude=-73.9],[latitude=41.5,longitude=-72.9]]剥离):[map]

$lastStart = 0; // Position where we last cut
$len = strlen( $str);
$openedBraces = 0; // Number of braces opened
$result = array();

for( $i = 0; $i < $len; $i++){
    switch( $str[$i]){
        // Handle opening brace
        case '[':
           $openedBraces++;
           break;

        // Handle closing brace
        case ']':
           $openedBraces--; // You may want to check negative numbers
           break;

        // Handle coma (it's sane operation only if there are no braces opened)
        case ',':
           if( $openedBraces == 0){
               $result[] = substr( $str, $lastStart, $i-$lastStart);
               $lastStart = $i+1;
           }
           break;
    }
}

$result[] = substr( $str, $lastStart);

工作codepad.org示例。

于 2012-11-22T14:58:15.730 回答