повторы в регулярном выражении

clevel

Новичок
повторы в регулярном выражении

Не знаю, как точно назвать тему.
Ситуация следующая:

есть некий хтмл код:

<td class="sale1">IF[{c18.length}>0]{<a href=/p10/l2/index\.html><img class=preview src={c18.src}></a>}</td>

Есть реглярка, которая вытаскивает данные:
"/IF\[([^]]*)\]\s*\{(.*?)\}\s*(ELSE\s*\{(.*?)\}|)/sm"

Проблема в том, что в данных попадается "{c18.src}" и конечный результат не совпадает с желанным. Если убрать "жадность" в регулярке для второго случая, то мы вообще получим более широкие данные, что тоже недопустимо.

Вопрос: есть ли возможность проверять в данной регулярке кол-во входящих { и на основе этого брать предел до n+1 символа }

Надеюсь. обяъснил доступн.
Заранее спасибо.
 

Necromant

Новичок
А может стоит рaзбить на 2 этапа:
1. выделить <td class="sale1">(.*?)</td>
2. выделять <img src="">
 

lorien

Новичок
Я бы использовал условие.
Читай в мане про Conditional subpatterns.
Вот пример моего регекспа, который юзает условие:
Код:
			preg_match('{
				^(
				  (?(?=\$\$)
				    \$\$.*?\$\$ | .
				  )+?
				);
				\s* (?:\r?\n | $) 
				(.*)}xs',$data,$m
			)
 

clevel

Новичок
Так как хочется универсальности + код должен быть читабельным, я поступил следующим образом:

написал функцию на 60 строк, которая ищет вхождение строки 'IF[' и парсит в отдельные переменные условие, истинное значение, ложное значение (если есть), полный текст от 'IF[' до конца ложного значения.
При этом идет учет вхождений '{' и '}' в рамках истинного и ложного значений

Потом простым str_replace замещаю данные и вуаля!

Всем спасибо за советы!
 
Сверху