Регулярные выражения. Нормализация атрибутов тегов

Smelo

Новичок
Регулярные выражения. Нормализация атрибутов тегов

В двух словах. нужно из таких тегов <tagName attr1='val1' attr2=val2 attr3=val3[] и тд >
сделать такие <tagName attr1='val1' attr2='val2' attr3='val3[]' и тд >

и всё бы решилось простой регуляркой:
PHP:
#<\w+(?:[^>]+)((\w+)=(?![\'\"])([^\s>]+))(?:[^>]*)>#is
еслиб не такая байда со ссылками <a href="?aaa=aaa">aaa</a>

соб-но, я не знаю как бы сделать просмотр и запретить искать атрибуты в атрибуте

пробовал делать в два этапа:
1. выбрать все теги:
PHP:
#<\w+\s((?:\s*(\w+)(?:=(\"[^\"]*\"|\'[^\']*\'|(?![\'\"])[^\s>]*))?\s*)+)>#is
2. выбирать атрибуты, но всё равно никак.

идей больше нет.
нужно именно регуляркой(ами)

тут нужно что-то вроде атомарной группировки...
 

DiMA

php.spb.ru
Команда форума
на регах идеально задача не решается, нужно строить дерево тегов и проходить каждый тег/атрибуты ручками

очевидно, твой рег обломится здесь: <a href="\"">

кроме того не учтены варианты с пробелами и без кавычек:

<a href = aaa style = ... >
 

Smelo

Новичок
очевидно, твой рег обломится здесь: <a href="\""><<<

Ну это решается просмотром
кроме того не учтены варианты с пробелами и без кавычек:<<<

именно они мне и нужны,
нужно поставить их в кавычки

дерево строить не нужно, достаточно выбрать все теги в которых есть хотя бы один атрибут без кавычек и проходить по атрибутам,
как проходить по атрибутам не ясно

-~{}~ 25.08.09 11:41:

нужен опытный регулярщик

-~{}~ 25.08.09 12:01:

жесть какая-то,
имею строку
attr="?aaa=aaa" attr2=bbbb attr3='cccc' attr4=gggg

какого хрена, примерно в такой регулярке происходит возврат???
PHP:
#(\w+)\s*=\s*(?>\'(?:[^\']+|(?<=\\)\'+)\'|\"(?:[^\"]+|(?<=\\)\"+))\"|(?![\'\"])[^\s>]+)#is
 

FractalizeR

Новичок
А что это за задание, можно спросить? Такого рода процедуру нужно выполнять регулярно на заранее неизвестных HTML или одноразово?

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

Самый простой способ - загрузить кривой HTML в FireFox и активировать FireBug. Потом перейти на вкладку HTML и все оттуда скопировать.

Если HTML файлов много - можно воспользоваться ActiveX Internet Explorer. Грузить в него страницу, а потом DOM из него выгрузить в файл.
 

Smelo

Новичок
выполнять нужно "на лету"
нужно для валидации кода, для последующего "безглючного" парсинга
 

FractalizeR

Новичок
Если так, не проще ли просто запрещать кривой HTML код для ввода? Тогда вся проверка сведется к проверке валидности переданного XML
 

Smelo

Новичок
по кой мне ради кавычек, либа целая
да и потом она идёт как расширение, это мне не подходит

вообщем, я забил на валидацию, решил изменить "подход" в приложении
 

Smelo

Новичок
во все регулярки приложения добавлять условие типа такого (?(?=[\'\"])###|###)

тема не закрыта =)
 

Smelo

Новичок
тем что иметь нормалзотор, это зашибись как хорошо было бы =)
да и регулярки короче остальные
вобщем, я бы хотел выслушать решение по нормализации регулярками, если есть конечно знающие =)
 

FractalizeR

Новичок
Да чего ж вы так уперлись в регулярки-то :) Чем не устраивают другие решения, можете сказать?
 

Smelo

Новичок
какие, кроме расширений?

-~{}~ 25.08.09 20:38:

вроде как, проблема решена

$t = preg_replace_callback('#(\w+)\s*=\s*(\'([^\']+)\'|\"([^\"]+)\"|((?![\'\"])[^\s>]+))#', create_function('$m','if($m[5]){ return str_replace($m[2],"\'".addslashes($m[5])."\'",$m[0]); }else{ return $m[0];}'), $t);
 

FractalizeR

Новичок
Валидация XML например. Зачем пользователю давать вводить кривой HTML вообще?
 

Smelo

Новичок
ээ, а что там за валидация хмл такая?
ну отсутствие кавычек, это ещё не кривой хтмл, просто плохой тон
а вводить этот хтмл будет верстильщик =)

впринципе, сделать то что мне нужно, можно и без валидации, но с валидацией то красивее =)
 

FractalizeR

Новичок
Ну так если вы не поняли, "что за валидация XML", зачем тупо использовать регулярки, не пытаясь ничего другого осознать?

Берете ввод дизайнера и проверяете через DOMDocument на соответствие XHTML. Зачем давать дизайнеру возможность вводить кривой HTML с аттрибутами без кавычек? Лучше уж пусть сразу нормально делать учится.
 

dimagolov

Новичок
Smelo, а в чем глубокий смысл исправлять отдельные ошибки верстальщика, когда в целом валидация не делается? куда проще и эффективней было бы полученную от верстальщика страницу подсовывать online-валидатору, скажем http://validator.w3.org, пусть он сам правит свои бока.
 
Сверху