Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   О, чо написал. (https://javascript.ru/forum/project/12913-o-cho-napisal.html)

B~Vladi 08.11.2010 19:00

О, чо написал.
 
/(?:<!--([\s\S]*?)-->)|(?:<!\[CDATA\[([\s\S]*?)\]\]>)|(?:<(\/)?([\w\-_]+)(?::([\w\-_]+))?((?:[\s]*[\w\-_]+(?::[^=]+)?="[^"]*")*)\s*(\/)?>)/gi


В replace, например, попадут аргументы:
result, isComment, isCDATA, isCloseTag, prefix, name, attributes, isEmptyTag, index

Разбор attributes:
/[\s]*([\w\-_]+)(?::([^=]+))?="([^"]*)"/gi

Аргументы:
result, prefix, name, data, index

:D
Хз, может кому и понадобиться.:write:

tenshi 09.11.2010 01:32

сакс парсер пишешь? х)

B~Vladi 09.11.2010 08:34

Цитата:

Сообщение от tenshi
сакс парсер пишешь? х)

Да не суть :)
Регулярки же у нас во всех языках перловые. Пусть останется на просторах интернета, т.к. я больше нигде не видел такого.

vflash 09.11.2010 13:18

<option selected> ? а такое попадает

B~Vladi 09.11.2010 13:52

Ах, да, забыл написать, что текст должен быть валидным xml. Нет, не попадает. Но при желании поправить можно.

subzey 09.11.2010 15:30

Теперь любой сможет с лёгкостью найти эти бесценные строки в гугле по запросу "о, чо написал" :)

B~Vladi 07.09.2011 18:10

О, ещё чо написал: :write:
Теги:
/(?:<!--([\s\S]*?)-->)|(?:<!\[CDATA\[([\s\S]*?)\]\]>)|(?:<\/\s*([a-z\-_]+)(?::([a-z\-_]+))?\s*>)|(?:<\s*([a-z\-_]+)(?::([a-z\-_]+))?((?:\s*[a-z\-_]+(?::[a-z\-_]+)?\s*(?:=\s*(?:(?:"[^"]*")|(?:'[^']*')))?)*)\s*(\/)?>)/gi

Атрибуты:
/(?:\s*([a-z\-_]+)(?::([a-z\-_]+))?\s*(?:=\s*(?:(?:"([^"]*)")|(?:'[^']*')))?)*/gi

Это для HTML. Корректно отрабатывает, например, такой код:
<nts:as asd asd:as=" ' asd:fake_attr " asd:as = ' " asd:fake_attr ' />


Вообще сказать, везде пишут что парсинг HTML-кода регулярками великое зло, в том числе на stack overflow и хабре. Может потому что не справились?...
Если кто найдет ошибку - дайте знать :)

Kolyaj 07.09.2011 18:24

Цитата:

Сообщение от B~Vladi
Корректно отрабатывает

А что значит отрабатывает?

Цитата:

Сообщение от B~Vladi
Вообще сказать, везде пишут что парсинг HTML-кода регулярками великое зло, в том числе на stack overflow и хабре. Может потому что не справились?...

Наверно потому, что регулярками невозможно проверить правильность вложенности тегов.

B~Vladi 07.09.2011 18:26

Цитата:

Сообщение от Kolyaj
А что значит отрабатывает?

Ой, обрабатывает.
Цитата:

Сообщение от Kolyaj
Наверно потому, что регулярками невозможно проверить правильность вложенности тегов.

Спорим на $100500 что можно? А вообще зачем? В HTML допускаются незакрытые теги br и img например. Хотя и это можно учесть.

Kolyaj 07.09.2011 18:28

Давай начнём с простого, проверка правильности расстановки скобок одного типа.
var str = '()((()())(())()(()))'; // например

Kolyaj 07.09.2011 18:34

Да, кстати, предполагается, что решение будет только с регулярками, без всяких callback-функций.

B~Vladi 07.09.2011 18:37

Есть один недочет. Не найдет такой код:
<nts:as asd jhg=321 asd:as=" ' asd:fake_attr " asd:as = ' " asd:fake_attr ' />

Но его легко поправить, поэтому я оставлю эту задачу для вас :)
Цитата:

Сообщение от Kolyaj
Да, кстати, предполагается, что решение будет только с регулярками, без всяких callback-функций.

Регулярка способна обработать за один раз - один тег. Без функции никак. Например с таким кодом можно:
string.replace(reg, function(){/* тут вся магия */});

Цитата:

Сообщение от Kolyaj
Давай начнём с простого, проверка правильности расстановки скобок одного типа.

Вот тут не понял, это что ещё за скобки и типы?

Kolyaj 07.09.2011 18:46

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

Я не сразу понял, какая у тебя задача. Как я понимаю, это выловить во входном потоки все теги? Вложенность будет проверять какой-то другой механизм.

B~Vladi 07.09.2011 18:51

Цитата:

Сообщение от Kolyaj
Ну ты сказал, что регулярками определишь вложенность тегов, скобки те же теги.

Понял.
Цитата:

Сообщение от Kolyaj
Как я понимаю, это выловить во входном потоки все теги?

Ну не просто выловить все теги, а ещё разобрать их на составляющие. Например, можно использовать для подсветки. Вложенность проверяется js-логикой, при нахождении очередного тега.

Kolyaj 07.09.2011 18:51

А чем плох простой?
Код:

/<("[^"]*"|'[^']'|[^>])+>/
UPD: понял, составляющие ещё нужны. Хотя проще, наверное, составляющие отдельно вытаскивать.

B~Vladi 07.09.2011 19:01

Цитата:

Сообщение от Kolyaj
А чем плох простой?

Ещё тем, что это найдет синтаксически сломанные теги. Получаются расхождения с парсерами браузеров. Хотя они тоже по-разному парсят, если синтаксис нарушен.
Цитата:

Сообщение от Kolyaj
Хотя проще, наверное, составляющие отдельно вытаскивать.

Ещё пятью регулярками и парой функций? Не думаю.

Kolyaj 07.09.2011 19:13

Пять простых регулярок лучше, чем одна сложная.

B~Vladi 07.09.2011 20:41

Цитата:

Сообщение от Kolyaj
Пять простых регулярок лучше, чем одна сложная.

Простыми не получится. Например, твоя регулярка упадет на этом:
<!--
<div asdasas="">
-->

Комментарии не должны обрабатываться. Ещё есть инлайновые скрипты, стили, так что...

Пока ехал домой, мысленно нашел несколько багов, завтра исправлю.

B~Vladi 07.09.2011 21:09

Исправил баги:
/(?:<!--([\s\S]*?)-->)|(?:<!\[CDATA\[([\s\S]*?)\]\]>)|(?:<\/[\s\n\r]*([a-z\-_]+)(?::([a-z\-_]+))?[\s\n\r]*>)|(?:<[\s\n\r]*([a-z\-_]+)(?::([a-z\-_]+))?((?:[\s\n\r]+[a-z\-_]+(?::[a-z\-_]+)?[\s\n\r]*(?:=[\s\n\r]*(?:(?:"[^"]*")|(?:'[^']*')|(?:([^\s]+))))?)*)[\s\n\r]*(\/)?>)/gi

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

9xakep 16.11.2011 17:05

А где может использоваться вся эта писанина?

B~Vladi 16.11.2011 20:28

В программном коде.

9xakep 17.11.2011 16:17

=/ Я имел ввиду что ваш код делает?

Nekromancer 17.11.2011 16:40

Выше же писали - парсит XML валидную входящую строку и разбирает её на теги и атрибуты.
Если вы не знали, то сообщаю, что такие регулярки можно использовать не только в JS.

B~Vladi 17.11.2011 20:37

Цитата:

Сообщение от Nekromancer
парсит XML валидную входящую строку и разбирает её на теги и атрибуты.

Ну в общем да, это делала первая версия регулярки. Последняя парсит и HTML со всеми "допусками".
Использовал в своем шаблонизаторе.


Часовой пояс GMT +3, время: 21:49.