2014-02-13 69 views
1

所以,我有以下字符串:PHP分割字符串

{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中实现这一点?这让我感到很紧张,在过去的几个小时里一直试图用正则表达式来解决这个问题,目前还没有结果。

提前致谢!

+9

你如何区分':'和逗号的不同含义?例如,'import_family'也可能具有值'Open + Sans:300,300个本地,常规,斜体,600,600个,700,700个,800,800个,类名:opensans'。 – Overv

+0

第一个字符串是否是有效的JSON? 是你的“矢量化”输出一个字符串或一个PHP数组? –

+0

@Overv你可以简单地把它作为一个先决条件,键是小写的,它是完全可分解的。 – meagar

回答

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 
) 
+0

你是最棒的!我已经删除了头文件并将$ obj声明为array();它的作品非常棒!谢谢! –

+0

@dorian你能接受我的回答吗? – Overv

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,较短的正则表达式为:

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