очень срочно нужно написать регулярное выражение чтобы отпарсить определенную строку. Сложность в том что каждая подстрока имеет еще другую последовательность разной длинны. Примерно вот HTML: <div> <h1>STR_1<h1> <h2>STR_2</h2> <ol> <li> STR_3 <li> STR_4 <li> STR_5 </ol> </div> <div> <h1>STR_1<h1> <h2>STR_2</h2> <ol> <li> STR_3 <li> STR_4 <li> STR_5 <li> STR_6 <li> STR_7 </ol> </div> вот мне нужно отпарсить и получить все данные на месте помеченным STR_
slesh Тут рекурсивные регулярки НЕ нужны (только замедлят), вначале получаем все что между дивов, а потом уже получаем все STR PHP: <pre><? $in=<<<HTT <div> <h1>STR_1a</h1> <h2>STR_2a</h2> <ol> <li> STR_3a <li> STR_4a <li> STR_5a </ol> </div> <div> <h1>STR_1b</h1> <h2>STR_2b</h2> <ol> <li> STR_3b <li> STR_4b <li> STR_5b <li> STR_6b <li> STR_7b </ol> </div> HTT; //echo $in; preg_match_all('~<div>(.+)</div>~Usi',$in,$result); foreach($result[1] as $i => $one) { // Получсаем заголовки preg_match('~<h1>([\s\S]*)</h1>\s*<h2>([\s\S]*)</h2>~Ui',$one,$head); // Выдираем все элементы списка preg_match_all('~<li> ([^\r\n]*)~i',$one,$tmp); echo '<hr>'.$head[1].'<hr>'.$head[2].'<hr>'; print_r($tmp[1]); } ?>
2 Pashkela: Как есть так есть. Да и вообщето </li> - необязателен (читай доки ) 2 Gifts: спс за код. Просто думал что возможно это сделать в один проход
Можно и одним проходом, главное составить нужную регулярку. Если бы у тебя тег li был закрыт, то регулярка выглядела бы так: PHP: <?php $str = <<<STR <div> <h1>STR_1a</h1> <h2>STR_2a</h2> <ol> <li> STR_3a</li> <li> STR_4a</li> <li> STR_5a</li> </ol> </div> <div> <h1>STR_1b</h1> <h2>STR_2b</h2> <ol> <li> STR_3b</li> <li> STR_4b</li> <li> STR_5b </li> <li> STR_6b</li> <li> STR_7b</li> </ol> </div> STR; preg_match_all('#<(h[12]{1}|li)>([^>]*)</\\1>#s', $str, $out); print_r($out[2]); ?> Или если всё таки они не закрыты, то парсим вот так: PHP: <?php $str = <<<STR <div> <h1>STR_1a</h1> <h2>STR_2a</h2> <ol> <li> STR_3a <li> STR_4a <li> STR_5a </ol> </div> <div> <h1>STR_1b</h1> <h2>STR_2b</h2> <ol> <li> STR_3b <li> STR_4b <li> STR_5b <li> STR_6b <li> STR_7b </ol> </div> STR; preg_match_all("#<(h[12]{1}|li)>([^>]*)(</h[12]{1}>|\r\n)#s", $str, $out); print_r($out[2]); ?> Хитрый финт ушами))
2 ChaaK скажено же что нужно не только то, что в LI но и заголовки. И вообще эта тема уже неактуально ибо строчность уже пропала.