Regex для соответствия свойств стиля HTML - PullRequest
0 голосов
/ 01 сентября 2009

Нуждается в мастере регулярных выражений здесь!

<img src="\img.gif" style="float:left; border:0" />
<img src="\img.gif" style="border:0; float:right" />

Учитывая приведенный выше HTML, мне нужен шаблон регулярного выражения, который будет соответствовать "float: right" или "float: left", но только для тега img.

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 01 сентября 2009
/<img\s[^>]*style\s*=\s*"[^"]*\bfloat\s*:\s*(left|right)[^"]*"/i

Должен сообщить вам, однако: по моему опыту, независимо от того, какое регулярное выражение вы пишете, кто-то сможет найти действительный HTML, который его нарушает. Если вы действительно хотите сделать это в общем и надежном виде, вам нужно проанализировать HTML, а не бросать в него регулярные выражения.

2 голосов
/ 01 сентября 2009

Вы действительно не должны использовать регулярные выражения для анализа html или xml, невозможно разработать надежное регулярное выражение, которое будет обрабатывать все угловые случаи. Вместо этого я бы предложил найти библиотеку html-разбора для вашего языка.

Тем не менее, вот возможное решение с использованием регулярных выражений.

<img\s[^>]*?style\s*=\s*".*?(?<"|;)(float:.*?)(?=;|").*?"

"float:" будет захвачен в единственной группе захвата, которая должна быть номером 1.

Регулярное выражение в основном соответствует началу тега img, за которым следует любой тип символа, который не является закрывающей скобкой любое количество раз, за ​​которым следует атрибут style. Внутри значения атрибута style значение float: может находиться в любом месте атрибута, но оно должно соответствовать только фактическому стилю float (т. Е. Ему предшествует начало атрибута или точка с запятой, а затем точка с запятой или конец атрибута) .

0 голосов
/ 01 сентября 2009

Я согласен с Шоном Найманом, лучше не использовать регулярные выражения (по крайней мере, не для чего-то постоянного). Для чего-то особенного и более долговечного, вы можете попробовать:

/<img\s(?:\s*\w+\s*=\s*(?:'[^']*'|"[^"]*"))*?\s*\bstyle\s*=\s*(?:"[^"]*?\bfloat\s*:\s*(\w+)|'[^']*?float\s*:\s*(\w+)/i
...