Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Регулярные выражения. Нормализация атрибутов тегов (Mr.M.I.T.)
Author Message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Mon Aug 24, 2009 8:39 pm (написано за 5 минут)
   Post subject: Регулярные выражения. Нормализация атрибутов тегов
Reply with quote

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

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

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

пробовал делать в два этапа:
1. выбрать все теги
Code (any language): скопировать код в буфер обмена
#<\w+\s((?:\s*(\w+)(?:=(\"[^\"]*\"|\'[^\']*\'|(?![\'\"])[^\s>]*))?\s*)+)>#is
2. выбирать атрибуты, но всё равно никак.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Aug 24, 2009 9:10 pm (спустя 31 минуту; написано за 42 секунды)
   Post subject:
Reply with quote

Mr.M.I.T.
Слышали про такую штуку, как HTML Tidy, или что-то вроде того от W3C? Как раз занимается "улучшением" кода, в том числе и расстановкой кавычек.
Back to top
View user's profile Send private message Send e-mail
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Mon Aug 24, 2009 9:27 pm (спустя 16 минут; написано за 1 минуту 36 секунд)
   Post subject:
Reply with quote

нет. но мне нужно именно регуляркой, или стандартными средствами пхп
вроде как Дмитрий Котеров спец. в регулярках, очень хотелось бы его помощи =)
тем более он уже писал парсеры html регулярками
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Mon Aug 24, 2009 9:42 pm (спустя 14 минут; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Mr.M.I.T., HTML в общем случае регулярками разбирать нельзя.
Tidy (www.php.net/manual/en/tidy.installation.php) это вполне стандартное PECL расширение для PHP.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Aug 24, 2009 9:55 pm (спустя 13 минут; написано за 31 секунду)
   Post subject:
Reply with quote

dimagolov wrote:
HTML в общем случае регулярками разбирать нельзя.
Извините, что вмешиваюсь, но я бы всё-таки сказал «не рекомендуется», а не «нельзя», ибо это просто достаточно сложно и малоэффективно :).
Back to top
View user's profile Send private message Send e-mail
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Mon Aug 24, 2009 10:10 pm (спустя 14 минут; написано за 36 секунд)
   Post subject:
Reply with quote

а там на сишнике не регулярки чтоли?
Back to top
View user's profile Send private message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Mon Aug 24, 2009 10:15 pm (спустя 4 минуты; написано за 11 секунд)
   Post subject:
Reply with quote

да и задача у меня вроде бы простая?...
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Mon Aug 24, 2009 11:00 pm (спустя 45 минут; написано за 3 минуты 5 секунд)
   Post subject:
Reply with quote

там конечный автомат наверняка. и реализация завязана на libtidy (tidy.sourceforge.net/), а не на регулярки.

п.с. PHP умеет работать с регулярками потому что в нем реализована стандартным расширением pcrelib, которая их обрабатывает.
Back to top
View user's profile Send private message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Mon Aug 24, 2009 11:20 pm (спустя 19 минут; написано за 48 секунд)
   Post subject:
Reply with quote

ну вобщем, мне в любом случае нужно сделать регулярками(лучше одной)
нужен спец по регуляркам
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Tue Aug 25, 2009 11:40 am (спустя 12 часов 20 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Лучше не делать этого регулярками, но если очень хочется:
Code (any language): скопировать код в буфер обмена
header('Content-Type: text/plain');
$t = 'abc="def" ghi = jkl mno=\'pqr\' stu=vwx yza = "bc=de"';
$r = preg_match_all('/([a-z]+)\s*=\s*([\'"]?)([^\s]+|[^\'"]+)\\2/', $t, $match, PREG_SET_ORDER);
var_dump($t, $r, $match);
Back to top
View user's profile Send private message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Tue Aug 25, 2009 1:48 pm (спустя 2 часа 7 минут; написано за 2 минуты 31 секунду)
   Post subject:
Reply with quote

не мне нужно заменить атрибуты типа attr=val без кавычек
на attr='val' с кавычками
и всё бы хорошо, еслиб не такие атрибуты
attr="aaa=bbb" или attr=?aaa=bbb&ggg=ccc
типа ссылки
Back to top
View user's profile Send private message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Tue Aug 25, 2009 1:49 pm (спустя 1 минуту 29 секунд; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

вот из этого
$t = " abc=\"def\" ghi = jkl mno='pqr' stu=vwx yza = \"bc=de\" abccc=\"aaaa=bbbb\" mmmm=\"ggg\\\"ddddd\" arrr=?arrr=ggg&ccc=ppp ";
нужно
$t = " abc=\"def\" ghi ='jkl' mno='pqr' stu='vwx' yza = \"bc=de\" abccc=\"aaaa=bbbb\" mmmm=\"ggg\\\"ddddd\" arrr='?arrr=ggg&ccc=ppp' ";
Back to top
View user's profile Send private message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Tue Aug 25, 2009 1:50 pm (спустя 38 секунд; написано за 12 секунд)
   Post subject:
Reply with quote

тоесть нужно preg_replace_callback
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Tue Aug 25, 2009 4:30 pm (спустя 2 часа 40 минут; написано за 2 минуты 10 секунд)
   Post subject:
Reply with quote

Что же вы такой ленивый :-)
Code (any language): скопировать код в буфер обмена
header('Content-Type: text/plain');
//$t = 'abc="def" ghi = jkl mno=\'pqr\' stu=vwx yza = "bc=de"';
$t = " abc=\"def\" ghi = jkl mno='pqr' stu=vwx yza = \"bc=de\" abccc=\"aaaa=bbbb\" mmmm=\"ggg\\\"ddddd\" arrr=?arrr=ggg&ccc=ppp ";
$t2 = preg_replace('/([a-z]+)\s*=\s*([\'"]?)([^\s]+|[^\'"]+)\\2/', '\\1=\'\\3\'', $t);
var_dump($t, $t2);
Правда, в атрибуте mmmm совсем невалидный код, и если там будет пробел и кавычка, то регулярка сработает неверно (для этого варианта регулярку вообще невозможно написать). Как уже посоветовали выше, вам нужен htmltidy.
Back to top
View user's profile Send private message
Mr.M.I.T.
Заглянувший



Joined: 11 Apr 2008
Posts: 19
Карма: -1
   поощрить/наказать


PostPosted: Tue Aug 25, 2009 7:42 pm (спустя 3 часа 12 минут; написано за 18 секунд)
   Post subject:
Reply with quote

Ура, до меня дошло =)
спасибо вам
Code (php): скопировать код в буфер обмена
$t = preg_replace_callback (www.php.net/preg_replace_callback)('#(\w+)\s*=\s*(\'([^\']+)\'|\"([^\"]+)\"|((?![\'\"])[^\s>]+))#', create_function (www.php.net/create_function)('$m','if($m[5]){ return str_replace($m[2],"\'".addslashes($m[5])."\'",$m[0]); }else{ return $m[0];}'), $t);
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Mon Sep 07, 2009 11:36 am (спустя 12 дней 15 часов 53 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «спам»,
расположенную в форуме Мусоропровод (07 Сентября 2009, 12:36).
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML