2012-11-14 13 views
7

mam preg_match_all funkcję:preg_match_all do prostego tablicy

preg_match_all('#<h2>(.*?)</h2>#is', $source, $output, PREG_SET_ORDER); 

To działa zgodnie z przeznaczeniem, ale problemem jest to, że preg_matches wszystkie przedmioty dwukrotnie i do ogromnego wielowymiarowe tablicy jak to na przykład, gdzie, jak zamierzono , preg_matched wszystkie 11 pozycji potrzebne, ale dwa razy i do wielowymiarowej tablicy:

Array 
(
    [0] => Array 
     (
      [0] => <h2>10. <em>Cruel</em> by St. Vincent</h2> 
      [1] => 10. <em>Cruel</em> by St. Vincent 
     ) 

    [1] => Array 
     (
      [0] => <h2>9. <em>Robot Rock</em> by Daft Punk</h2> 
      [1] => 9. <em>Robot Rock</em> by Daft Punk 
     ) 

    [2] => Array 
     (
      [0] => <h2>8. <em>Seven Nation Army</em> by the White Stripes</h2> 
      [1] => 8. <em>Seven Nation Army</em> by the White Stripes 
     ) 

    [3] => Array 
     (
      [0] => <h2>7. <em>Do You Want To</em> by Franz Ferdinand</h2> 
      [1] => 7. <em>Do You Want To</em> by Franz Ferdinand 
     ) 

    [4] => Array 
     (
      [0] => <h2>6. <em>Teenage Dream</em> by Katie Perry</h2> 
      [1] => 6. <em>Teenage Dream</em> by Katie Perry 
     ) 

    [5] => Array 
     (
      [0] => <h2>5. <em>Crazy</em> by Gnarls Barkley</h2> 
      [1] => 5. <em>Crazy</em> by Gnarls Barkley 
     ) 

    [6] => Array 
     (
      [0] => <h2>4. <em>Kids</em> by MGMT</h2> 
      [1] => 4. <em>Kids</em> by MGMT 
     ) 

    [7] => Array 
     (
      [0] => <h2>3. <em>Bad Romance</em> by Lady Gaga</h2> 
      [1] => 3. <em>Bad Romance</em> by Lady Gaga 
     ) 

    [8] => Array 
     (
      [0] => <h2>2. <em>Pumped Up Kicks</em> by Foster the People</h2> 
      [1] => 2. <em>Pumped Up Kicks</em> by Foster the People 
     ) 

    [9] => Array 
     (
      [0] => <h2>1. <em>Paradise</em> by Coldplay</h2> 
      [1] => 1. <em>Paradise</em> by Coldplay 
     ) 

    [10] => Array 
     (
      [0] => <h2>Song That Get Stuck In Your Head YouTube Playlist</h2> 
      [1] => Song That Get Stuck In Your Head YouTube Playlist 
     ) 

) 

Jak przekonwertować tej tablicy w jednym prostym i bez tych zduplikowanych elementów? Dziękuję Ci bardzo.

Odpowiedz

6

zawsze dostanie wielowymiarową tablicę z powrotem, jednak można zbliżyć się do tego, co chcesz tak:

if (preg_match_all('#<h2>(.*?)</h2>#is', $source, $output, PREG_PATTERN_ORDER)) 
    $matches = $output[0]; // reduce the multi-dimensional array to the array of full matches only 

A jeśli nie chcesz submatch w ogóle, a następnie użyć nie- przechwytywanie grupowanie:

if (preg_match_all('#<h2>(?:.*?)</h2>#is', $source, $output, PREG_PATTERN_ORDER)) 
    $matches = $output[0]; // reduce the multi-dimensional array to the array of full matches only 

Zauważ, że to wezwanie do preg_match_all korzysta PREG_PATTERN_ORDER zamiast PREG_SET_ORDER:

PREG_PATTERN_ORDER Przesyła wyniki tak, aby $ matches [0] było tablicą dopasowań pełnego wzorca, $ matches [1] to tablica ciągów dopasowanych przez pierwszy nawias wzięty z nawiasami i tak dalej.

PREG_SET_ORDER Przekazuje wyniki, dzięki czemu $ matches [0] jest tablicą pierwszych zestawów meczów, $ matches [1] to tablica drugiego zestawu meczów, a następnie .

Patrz: http://php.net/manual/en/function.preg-match-all.php

+1

Prawdopodobnie ma być $ matches = $ wyjściowe [0]. Dzięki to zadziałało :) – DadaB

+0

@MantasBalaisa Oh, masz rację! Nie jestem pewien, o czym myślałem. Dzięki. Naprawiony. – jimp

+0

Może trzeba uciec przed ukośnikami? – Dan

1

Zastosowanie

#<h2>(?:.*?)</h2>#is 

jako regex. Jeśli użyjesz grupy niezapisującej (co oznacza ?:), referencja wsteczna nie pojawi się w tablicy.

Powiązane problemy