Попробуйте вместо парсера:
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";
}
}
Выход:
<div id="t1">Content <div>more stuff</div></div>
<div id="t2">yes</div>
Скачать парсер можно здесь: http://simplehtmldom.sourceforge.net/
Редактировать: Больше для собственного удовольствия, я пытался сделать это в регулярном выражении. Вот что я придумал:
$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]);
}
Выход:
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>
)
И небольшое объяснение:
<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'
Теперь, возможно, вы понимаете, почему люди пытаются убедить вас в , а не , используя для этого регулярное выражение. Как уже отмечалось, это не поможет, если html сформирован неправильно: регулярное выражение создаст больший беспорядок на выходе, чем html-парсер, уверяю вас. Кроме того, регулярное выражение, вероятно, заставит ваши глаза кровоточить, и ваши коллеги (или люди, которые будут поддерживать ваше программное обеспечение) могут искать вас, увидев, что вы сделали. :)
Лучше всего сначала очистить ввод (используя TIDY или аналогичный), а затем использовать анализатор для получения необходимой информации.