简体   繁体   English

PHP拆分字符串

[英]PHP splitting a string

So I have the following string: 所以我有以下字符串:

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

I'd like to "vectorize" it, so maybe it would look something like this: 我想对其进行“向量化”,所以也许看起来像这样:

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';

Any ideas on how I could achieve this in PHP? 关于如何在PHP中实现此目标的任何想法? It's getting on my nerves, been trying to work it out with regular expressions for the last couple of hours with no results so far. 这让我感到不安,在过去的两个小时里一直试图用正则表达式解决这个问题,但到目前为止没有任何结果。

Thanks in advance! 提前致谢!

Here is a simple parser for this format you could use. 这是您可以使用的这种格式的简单解析器。 It will handle all fields and values and return them as a key/value array. 它将处理所有字段和值,并将它们作为键/值数组返回。 It assumes that the string starts and ends with curly braces and uses the field:optional:optional,a,b,c format. 假定字符串以大括号开头和结尾,并使用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));
?>

Output from the example string you specified: 您指定的示例字符串的输出:

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

Try this: 尝试这个:

$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]);

EDIT 编辑

As HamZa explains here , a shorter regular expression is: 正如HamZa 在这里说明的,一个较短的正则表达式是:

([^:,]+):(.+?)(?=,[^,]+:|$)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM