preg_match_all into simple array

13,880

Solution 1

You will always get a multidimensional array back, however, you can get close to what you want like this:

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

And if you don't want the submatch at all, then use a non-capturing grouping:

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

Note that this call to preg_match_all is using PREG_PATTERN_ORDER instead of PREG_SET_ORDER:

PREG_PATTERN_ORDER Orders results so that $matches[0] is an array of full pattern matches, $matches[1] is an array of strings matched by the first parenthesized subpattern, and so on.

PREG_SET_ORDER Orders results so that $matches[0] is an array of first set of matches, $matches[1] is an array of second set of matches, and so on.

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

Solution 2

Use

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

as your regex. If you use a non capturing group (which is what ?: signifies), a backreference won't show up in the array.

Share:
13,880

Related videos on Youtube

DadaB
Author by

DadaB

Noob seeking for knowledge

Updated on October 11, 2022

Comments

  • DadaB
    DadaB over 1 year

    I have preg_match_all function:

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

    It's working as intended, BUT the problem is, it preg_matches all items twice and into a huge multi dimensional array like this for example where it, as intended, preg_matched all 11 items needed, but twice and into a multidimensional array:

    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
            )
    
    )
    

    How to convert this array into simple one and without those duplicated items? Thank you very much.

  • DadaB
    DadaB over 11 years
    It probably supposed to be $matches = $output[0]. Thanks It worked :)
  • jimp
    jimp over 11 years
    @MantasBalaisa Oh, you're correct! I'm not sure what I was thinking. Thanks. Fixed.
  • Dan
    Dan almost 9 years
    Might need to escape the forward slashes?
  • jimp
    jimp almost 9 years
    @Silver89 No, '#' characters were used as the pattern delimiter. The forward slashes do not need escaping.