Сокращенная запись рег. выражения для выдергивания повторяющегося блока.

Тема в разделе "Регулярные выражения", создана пользователем trooll, 5 ноя 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Приветствую.

    есть html таблица:
    Код:
    <table>
    	<tr><td>000<td><td>111<td><td>222<td><td>333<td><td>444<td><td>555<td><td>666<td><td>777<td><td>888<td>															<td>999<td></tr>
    	<tr><td>000<td><td>111<td><td>222<td><td>333<td><td>444<td><td>555<td><td>666<td><td>777<td><td>888<td>															<td>999<td></tr>
    	<tr><td>000<td><td>111<td><td>222<td><td>333<td><td>444<td><td>555<td><td>666<td><td>777<td><td>888<td>															<td>999<td></tr>		
    </table>
    из нее надо дернуть данные, навоял регулярку:
    PHP:
    preg_match_all('#<tr>.+<td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td><td>(.+)</td>.+</tr>#smiU'$in$out);
    Знаю что регулярку можно сократить (не нравиться этот вариант реализации, ибо быдлокод), попытался сократить:
    PHP:
    preg_match_all('#<tr>.+(?:<td>(.+)</td>){10}.+</tr>#smiU'$in$out);
    Дергает только последний, десяты <td>(.+)</td>. Что делаю не так.
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    регулярки в php не поддерживают такие условные карманы, неопределённой длины. Обойти это насколько мне известно нельзя, только написанием такого большого быдлокода, либо применяя ещё доп поиск в общем кормане [0]
     
  3. jami

    jami Постоялец

    Регистр.:
    10 авг 2011
    Сообщения:
    114
    Симпатии:
    39
    Можно сократить, разбив на 2 регекспа + цикл:
    PHP:
    preg_match_all('|<tr>(.*?)</tr>|'$st$m);
    for (
    $i=1$i<count($m[1]); $i++) {
        
    preg_match_all'|<td>(.*?)</td>|'$m[1][$i], $m2);
    }
     
Статус темы:
Закрыта.