php
  • regex
  • preg-match
  • preg-match-all
  • 2015-04-21 25 views 1 likes 
    1

    本質上,我想讓這個字符串充滿data- *屬性,並將它們變成一個關聯數組,其中*是鍵,值是值。例如。PHP:使用正則表達式的關聯數組的屬性

    'data-pageid="11" data-start="12" => [pageid=>'11',start=>'12] 
    

    所以我有這個醜陋的正則表達式的代碼,看起來像

    $pattern = '/data-(\w+)=/'; 
    $string = '<strong class="annotate annotateSelected" data-pageid="1242799" data-start="80" data-end="86" data-canon="Season" data-toggle="tooltip" title="Season (SPORTS_OBJECT_EVENT)" data-placement="top" data-type="SPORTS_OBJECT_EVENT"><em>season</em></strong>'; 
    preg_match_all($pattern,$string,$result); 
    $arr = array(); 
    foreach($result[1] as $item){ 
        $pat = '/data-'.$item.'="(?P<'.$item.'>\w+?)"/'; 
    
        preg_match($pat, $string, $res); 
        $arr[$item] = $res[1]; 
    } 
    echo print_r($arr); 
    

    打印出

    Array 
    (
        [pageid] => 1242799 
        [start] => 80 
        [end] => 86 
        [canon] => Season 
        [toggle] => tooltip 
        [placement] => top 
        [type] => SPORTS_OBJECT_EVENT 
    ) 
    

    必須有這樣做的更好的方法。無論如何將這個提取到1個正則表達式函數中,還是我堅持這樣做。

    回答

    2

    可以使用指定的捕獲組,然後用array_combine() ...

    preg_match_all('~data-(?P<name>\w+)="(?P<val>[^"]*)"~', $str, $m); 
    print_r(array_combine($m['name'], $m['val'])); 
    

    輸出

    Array 
    (
        [pageid] => 1242799 
        [start] => 80 
        [end] => 86 
        [canon] => Season 
        [toggle] => tooltip 
        [placement] => top 
        [type] => SPORTS_OBJECT_EVENT 
    ) 
    
    +1

    Awesome..man,我在想,但未能實現。 –

    相關問題