2012-11-14 41 views
7

tôi có chức năng preg_match_all:preg_match_all vào mảng đơn giản

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

Nó làm việc như dự định, nhưng vấn đề là, nó preg_matches tất cả các mục hai lần và thành một mảng đa chiều khổng lồ như thế này ví dụ như nơi nó, như dự định , preg_matched tất cả 11 mục cần thiết, nhưng hai lần và thành một mảng đa chiều:

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 
     ) 

) 

Làm thế nào để chuyển đổi mảng này thành đơn giản và không có các mục trùng lặp? Cảm ơn nhiều.

Trả lời

6

Bạn sẽ luôn có được một mảng đa chiều trở lại, tuy nhiên, bạn có thể nhận được gần với những gì bạn muốn như thế này:

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 

Và nếu bạn không muốn submatch ở tất cả, sau đó sử dụng một phi chụp nhóm:

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 

Lưu ý rằng cuộc gọi này để preg_match_all là sử dụng PREG_PATTERN_ORDER thay vì PREG_SET_ORDER:

PREG_PATTERN_ORDER Kết quả đơn đặt hàng sao cho $ match [0] là một mảng của kết hợp mẫu đầy đủ, $ match [1] là một chuỗi các chuỗi phù hợp với mẫu con được ngoặc đơn đầu tiên, v.v.

PREG_SET_ORDER Kết quả đơn đặt hàng để $ match [0] là một mảng trong số tập hợp kết quả phù hợp đầu tiên, $ match [1] là một tập hợp các tập hợp kết quả thứ hai và .

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

+1

Nó có thể coi là $ trận đấu = $ đầu ra [0]. Cảm ơn Nó đã làm việc :) – DadaB

+0

@MantasBalaisa Oh, bạn đã đúng! Tôi không chắc mình đang nghĩ gì. Cảm ơn. Đã sửa. – jimp

+0

Có thể cần phải thoát khỏi dấu gạch chéo về phía trước? – Dan

1

Sử dụng

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

như regex của bạn. Nếu bạn sử dụng một nhóm không chụp (đó là những gì ?: nghĩa), một backreference sẽ không hiển thị trong mảng.

Các vấn đề liên quan