2014-02-13 70 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,較短的正則表達式爲:

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