İç içe Div etiketleri PHP RegExp

5 Cevap php

Ben div etiketleri içine içeriği Maç PHP'nin preg_match_all () ile kullanabileceğiniz bir regexpi gerekir. Divs şöyle:

<div id="t1">Content</div>

Ben "t [dizi]" id = ile tüm divs maçlarını şimdiye kadar bu regexp ile geldim

/<div id="t(\\d)">(.*?)<\\/div>/

Içerik bu gibi daha divlere, iç içe divlere oluşuyorsa sorun:

<div id="t1">Content <div>more stuff</div></div>

Herhangi bir iç içe etiketleri ile benim sıradanifade iş yapmak nasıl bir fikir?

Teşekkürler

5 Cevap

Yerine ayrıştırıcı deneyin:

require_once "simple_html_dom.php";
$text = 'foo <div id="t1">Content <div>more stuff</div></div> bar <div>even more</div> baz  <div id="t2">yes</div>';
$html = str_get_html($text);
foreach($html->find('div') as $e) {
    if(isset($e->attr['id']) && preg_match('/^t\d++/', $e->attr['id'])) {
        echo $e->outertext . "\n";
    }
}

Çıktı:

<div id="t1">Content <div>more stuff</div></div>
<div id="t2">yes</div>

Burada çözümleyici indirin: http://simplehtmldom.sourceforge.net/

Düzenleme: Ben regex bunu yapmaya çalıştım kendi eğlence için daha fazla. Burada ben ile geldi ne:

$text = 'foo <div id="t1">Content <div>more stuff</div></div> bar <div>even more</div>
      baz <div id="t2">yes <div>aaa<div>bbb<div>ccc</div>bbb</div>aaa</div> </div>';
if(preg_match_all('#<div\s+id="t\d+">[^<>]*(<div[^>]*>(?:[^<>]*|(?1))*</div>)[^<>]*</div>#si', $text, $matches)) {
    print_r($matches[0]);
}

Çıktı:

Array
(
    [0] => <div id="t1">Content <div>more stuff</div></div>
    [1] => <div id="t2">yes <div>aaa<div>bbb<div>ccc</div>bbb</div>aaa</div> </div>
)

Ve küçük bir açıklama:

<div\s+id="t\d+">  # match an opening 'div' with an id that starts with 't' and some digits
[^<>]*             # match zero or more chars other than '<' and '>'
(                  # open group 1
  <div[^>]*>       #   match an opening 'div'
  (?:              #   open a non-matching group
    [^<>]*         #     match zero or more chars other than '<' and '>'
    |              #     OR
    (?1)           #     recursively match what is defined by group 1
  )*               #   close the non-matching group and repeat it zero or more times
  </div>           #   match a closing 'div'
)                  # close group 1
[^<>]*             # match zero or more chars other than '<' and '>'
</div>             # match a closing 'div'

Insanlar not Bunun için regex kullanarak sizi ikna etmeye çalışın Şimdi neden belki anlıyorum. Zaten belirtildiği gibi html yanlış oluşmuş ise, bu yardımcı olmaz: regex html çözümleyici daha çıktı daha büyük bir karışıklık yapacak, ben sizi temin ederim. Ayrıca, regex muhtemelen gözlerini kanama yapacak ve arkadaşları (ya da yazılım koruyacak kişi) ne yaptığını gördükten sonra seni arıyor gelebilir. :)

Yapabileceğiniz en iyi şey ilk (TIDY veya benzeri kullanarak) giriş temizlemek, ve sonra istediğiniz bilgi almak için bir ayrıştırıcı kullanmaktır.

i kullanmak daha iyi olacağını düşünüyorum bazı DOM-instruments

Geçenlerde öğrendim, regex bunu yapamam.

http://stackoverflow.com/questions/1692830/matching-pair-tag-with-regex

Ben XPath kullanarak sona erdi ve bu bir cazibe gibi çalışır

Don't use regex to parse html.

If you believe this guy, there's at least one regex that does the trick, and he says it's faster than dom methods... I agree with him.

http://www.php.net/manual/fr/regexp.reference.recursive.php#95568

$ Pattern = "/ <(+ [\ w]) ([^>] ?) (([\s] />) |? (>: ((([^ <] ?|<!--. - >) | (R)) )</\1[\s]>)) / XSM? ";