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

Статус
В этой теме нельзя размещать новые ответы.

trooll

PHP кодер
Регистрация
22 Дек 2008
Сообщения
482
Реакции
117
Приветствую.

есть 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>. Что делаю не так.
 
регулярки в php не поддерживают такие условные карманы, неопределённой длины. Обойти это насколько мне известно нельзя, только написанием такого большого быдлокода, либо применяя ещё доп поиск в общем кормане [0]
 
Можно сократить, разбив на 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);
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху