解析值中包含冒号的不带引号的 JSON 对象

问题描述 投票:0回答:2

所以我有以下字符串:

{family:Open Sans,name:Open Sans,import_family:Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic,classname:opensans}

我想“矢量化”它,所以也许它看起来像这样:

XX['family'] = "Open Sans',
XX['name'] = 'Open Sans',
XX['import_family'] = 'Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic',
XX['classname'] = 'opensans';

关于如何在 PHP 中实现这一目标有什么想法吗?

php json regex decoding text-parsing
2个回答
1
投票

这是您可以使用的这种格式的简单解析器。它将处理所有字段和值并将它们作为键/值数组返回。它假定字符串以大括号开头和结尾,并使用

field:optional:optional,a,b,c
格式。

<?php
    header('Content-Type: text/plain');

    function parse($str) {
        $obj = [];

        $str = substr($str, 1, -1);
        $candidates = explode(',', $str);

        $lastKey = null;

        foreach ($candidates as $candidate) {
            if (strpos($candidate, ':')) {
                $parts = explode(':', $candidate);
                $key = $parts[0];
                $value = substr($candidate, strlen($key) + 1);

                $obj[$key] = $value;
                $lastKey = $key;
            } else {
                $obj[$lastKey] .= ',' . $candidate;
            }
        }

        return $obj;
    }

    $example = '{family:Open Sans,name:Open Sans,import_family:Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic,classname:opensans}';
    print_r(parse($example));
?>

您指定的示例字符串的输出:

Array
(
    [family] => Open Sans
    [name] => Open Sans
    [import_family] => Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic
    [classname] => opensans
)

1
投票

试试这个:

$s = "{family:Open Sans,name:Open Sans,import_family:Open+Sans:300,300italic,regular,italic,600,600italic,700,700italic,800,800italic,classname:opensans}";
$s = rtrim(ltrim($s, '{'), '}');

preg_match_all('#([^:,]+):((?:(?!(,[^:,]+:)).)*)#', $s, $matches);
$vector = array_combine($matches[1], $matches[2]);

编辑

正如 HamZa here 所解释的,更短的正则表达式是:

([^:,]+):(.+?)(?=,[^,]+:|$)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.