2012-12-05 80 views
1

我正在嘗試編寫一個函數,它將接受一個字符串並創建一個下拉列表。PHP:拆分複雜的字符串

下面是一個例子字符串:

Primary[Blue|0000FF,Red|FF0000,Yellow|FFFF00],Secondary[Green|00FF00,Orange|FF9900,Purple|663399],Brown|A52A2A,Silver|C0C0C0 

,我想變成這樣:

<select> 
<optgroup label="Primary"> 
<option value="0000FF">Blue</option> 
<option value="FF0000">Red</option> 
<option value="FFFF00">Yellow</option> 
</optgroup> 
<optgroup label="Secondary"> 
<option value="00FF00">Green</option> 
<option value="FF9900">Orange</option> 
<option value="663399">Purple</option> 
</optgroup> 
<option value="A52A2A">Brown</option> 
<option value="C0C0C0">Silver</option> 
</select> 

我一直在試圖將字符串轉換爲這樣的事情:

[0] => Primary 
[0][0] => Blue|0000FF 
[0][1] => Red|FF0000 
[0][2] => Yellow|FFFF00 
[1] => Secondary 
[1][0] => Green|00FF00 
[1][1] => Orange|FF9900 
[1][2] => Purple|663399 
[2] 
[2][0] => Brown|A52A2A 
[3] 
[3][0] => Silver|C0C0C0 

我不知道如何分割初始字符串。我嘗試過爆炸和preg_split,但似乎沒有分開我需要它的地方。

+0

您的字符串的模式是不相符的。 – Ibu

+4

也許只是使用json語法? –

+0

'explode('],',$ string)'將得到一個包含'[0] =>「Primary [藍色| 0000FF,紅色| FF0000,黃色| FFFF00」,[1] =>「Secondary [Green | 00FF00,Orange | FF9900,Purple | 663399「,[2] =>」Brown | A52A2A,Silver | C0C0C0「從這裏,你可以爆炸每個關於」[「的結果,而結果可以在」 」 – jonhopkins

回答

2

不知道你是如何結束這個字符串我會建議你考慮json_decodejson_encode

對於當前的格式,你可以使用:

$string = 'Primary[Blue|0000FF,Red|FF0000,Yellow|FFFF00],Secondary[Green|00FF00,Orange|FF9900,Purple|663399],Brown|A52A2A,Silver|C0C0C0'; 
preg_match_all("/([a-z]+)(\[([a-z0-9|,]+)\])|([a-z0-9|,]+)$/i", $string, $m); 

printf("<select>"); 
for($i = 0; $i < count($m[1]); $i ++) { 
    if (! empty($m[1][$i])) { 
     printf("\n\t<optgroup label=\"%s\">", $m[1][$i]); 
     foreach (array_filter(explode(",", $m[3][$i])) as $var) { 
      list($color, $hex) = explode("|", $var); 
      printf("\n\t\t<option value=\"%s\">%s</option>", $hex, $color); 
     } 
     printf("\n\t</optgroup>"); 
    } 
} 
foreach (array_filter(explode(",", $m[4][2])) as $var) { 
    list($color, $hex) = explode("|", $var); 
    printf("\n\t<option value=\"%s\">%s</option>", $hex, $color); 
} 
printf("\n</select>"); 

輸出

<select> 
    <optgroup label="Primary"> 
     <option value="0000FF">Blue</option> 
     <option value="FF0000">Red</option> 
     <option value="FFFF00">Yellow</option> 
    </optgroup> 
    <optgroup label="Secondary"> 
     <option value="00FF00">Green</option> 
     <option value="FF9900">Orange</option> 
     <option value="663399">Purple</option> 
    </optgroup> 
    <option value="A52A2A">Brown</option> 
    <option value="C0C0C0">Silver</option> 
</select> 
0

您可以嘗試拆分this regex(?![^\[]+\]),

然後從那裏查看字符串是否包含[]

$array = preg_split('/(?![^\[]+\]),/', $string); 

$return = array(); 

foreach($array as $val){ 
    if(preg_match('/(.*)\[(.*)\]/', $val, $match) === 1){ 
     $return[$match[1]] = explode(',', $match[2]); 
    } 
    else{ 
     $return[] = $val; 
    } 
} 

DEMO:http://ideone.com/BM0ewX