2016-06-28 28 views
2

我正在使用PHP。考慮,例如,下面的字符串:給定一個字符串創建一個具有命名鍵的多維數組使用正則表達式

$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]|a30" 

|爆炸是我得到的字符串:

a2c4-8 
a6c2,c3-5,c6[2],c8[4]-10,c14-21[5] 
a30 

現在我想後面的a從所有其它數字分開字符,刪除字母ac(保留破折號,逗號和方括號),並將結果放置在多維數組中,如下所示:

Array 
(
    [0] => Array 
     (
      [a] => 2 
      [c] => 4-8 
     ) 

    [1] => Array 
     (
      [a] => 6 
      [c] => 2,3-5,6[2],8[4]-10,14-21[5] 
    ) 

    [2] => Array 
     (
      [a] => 30 
      [c] => 
     ) 

) 

a之後總是跟隨數字,在此數字之後可能有或可能不是c,後跟其他逗號分隔的字符串。

請注意,在結果數組中,字母ac已被刪除。所有其他角色一直保留。我試圖通過修改this answer Casimir et Hippolyte但沒有成功。

A plus將被避免添加到結果數組中的空數組鍵(如上面的最後[c])。

+0

爆炸之後,您可能想要使用正則表達式來匹配不同的部分,然後將它們放入結果數組(如下所示:https://3v4l.org/XoIb1)。 – Rizier123

+0

是的,就是這樣! – Nicero

回答

1

考慮(因爲PHP 5.5購)和trim功能使用preg_match_all功能與名爲submasks((?P<a>)...)和PREG_SET_ORDER標誌,array_maparray_filterarray_column以下解決方案:

$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]|a30"; 
$parts = explode("|", $str); 

$result = array_map(function ($v) { 
    preg_match_all("/(?P<a>a\d+)?(?P<c>c[0-9-\[\]]+)?/", $v, $matches, PREG_SET_ORDER); 
    $arr = []; 
    $a_numbers = array_filter(array_column($matches, "a")); 
    $c_numbers = array_filter(array_column($matches, "c")); 
    if (!empty($a_numbers)) { 
     $arr['a'] = array_map(function($v){ return trim($v, 'a'); }, $a_numbers)[0]; 
    } 
    if (!empty($c_numbers)) { 
     $arr['c'] = implode(",", array_map(function($v){ return trim($v, 'c'); }, $c_numbers)); 
    } 

    return $arr; 
}, $parts); 

print_r($result); 

輸出:

Array 
(
    [0] => Array 
     (
      [a] => 2 
      [c] => 4-8 
     ) 

    [1] => Array 
     (
      [a] => 6 
      [c] => 2,3-5,6[2],8[4]-10,14-21[5] 
     ) 

    [2] => Array 
     (
      [a] => 30 
     ) 
) 

PS 「空陣列鍵」也被省略

相關問題