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.