2014-02-24 54 views
0

我試圖從http://shoelace.io/在PHP 解析我有這種格式的文本PHP爆炸格式化文本到陣列

.row.rowname 
    .boxname.col-sm-4 
    .boxtwo.col-sm-4 
    .boxthree.col-sm-4 
.row.therowbelowhasnoname 
    .theboxbelowhasnoname.col-sm-8 
    .col-sm-4 
.row 
    .col-sm-4 
    .col-sm-8 

,我要爆炸成一個多維數組 類似的財產以後得到一些翡翠格式化版式格式。

Array 
(
    [rowname] => Array 
     (
      [col] => Array 
       (
        [coltype] => col-sm-4 
        [colname] => boxname 
       ) 

      [col] => Array 
       (
        [coltype] => col-sm-4 
        [colname] => boxtwo 
       ) 
     ) 
    [therowbelowhasnoname] => Array 
     (
      [col] => Array 
       (
        [coltype] => col-sm-8 
        [colname] => theboxbelowhasnoname 
       ) 

      [col] => Array 
       (
        [coltype] => col-sm-4 
        [colname] => boxtwo 
       ) 
     ) 
) 

我該如何解決這個問題。 如果我只是換行爆炸(「\ n」)我失去的雙重空間山坳的

+0

爆炸僅僅是在做你想做的一個非常小的一步,可能不會在這種情況下使用。你是在一個非常特定的數組結構之後,爆炸並不支持「開箱即用」。 –

+0

我認爲手動迭代你的新行後跟一些簡單的模式匹配就足夠了。 – Scuzzy

+0

如您所述,您需要在'\ n'上進行爆炸,然後迭代數組中的每個成員並使用適當的邏輯進行字符串和/或RegEx比較 – Madbreaks

回答

2

我不知道你在[COL]想要的東西,但我做了一個數組

$string = ".row.rowname 
    .boxname.col-sm-4 
    .boxtwo.col-sm-4 
    .boxthree.col-sm-4 
.row.therowbelowhasnoname 
    .theboxbelowhasnoname.col-sm-8 
    .col-sm-4 
.row 
    .col-sm-4 
    .col-sm-8"; 

$array = array(); 
$lastindex = null; 
$continueuntillfound = null; 
foreach(explode(PHP_EOL,$string) as $item) 
{ 
    if($continueuntillfound and $item != $continueuntillfound) 
    continue; 
    $continueuntillfound = null; 
    if($item == '.row') 
    { 
    $continueuntillfound = '.row.'; 
    continue; 
    } 
    elseif(strpos($item,'.row.') === 0) 
    { 
    $lastindex = substr($item,5); 
    $array[$lastindex] = array(); 
    } 
    elseif($lastindex and $explode = explode('.',$item) and count($explode) > 2) 
    { 
    $array[$lastindex][] = array('coltype' => $explode[2],'colname' => $explode[1]); 
    } 
    elseif($explode = explode('.',$item)) 
    { 
    $array[$lastindex][] = array('coltype' => $explode[1],'colname' => 'boxtwo'); 
    } 
} 

print_r($array); 
+0

+1,但只適用於'rowname'是唯一的。 – AbraCadaver

+0

這很好,但它只能得到boxtwo –

+0

哪個是'boxtwo'?第一還是最後?我不確定'.row'是否是你輸出的一部分。是'.col-sm-4'行應該被忽略? – Scuzzy

0

在你的情況下,我會嘗試找到一個玉分析器,而不是自己構建。

現在,如果你仍然想自己嘗試,第一步就是使用\ n.row預分割文本(這意味着文本.row前面有一個新行)。我也想在beggining添加一個空白行,以便它捕捉到的第.row

$text=".row.rowname 
    .boxname.col-sm-4 
    .boxtwo.col-sm-4 
    .boxthree.col-sm-4 
.row.therowbelowhasnoname 
    .theboxbelowhasnoname.col-sm-8 
    .col-sm-4 
.row 
    .col-sm-4 
    .col-sm-8"; 



$tarray=preg_split("/\n\.row/","\n".$text,-1,PREG_SPLIT_NO_EMPTY); 
var_dump($tarray);