Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с помощью регулярных выражений? [закрыто]

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

393
задан Community 23 May 2017 в 12:26
поделиться

7 ответов

Вот некоторый забавный допустимый XML для Вас:

<!DOCTYPE x [ <!ENTITY y "a]>b"> ]>
<x>
    <a b="&y;>" />
    <![CDATA[[a>b <a>b <a]]>
    <?x <a> <!-- <b> ?> c --> d
</x>

И этим небольшим пакетом радости является допустимый HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [
    <!ENTITY % e "href='hello'">
    <!ENTITY e "<a %e;>">
]>
    <title>x</TITLE>
</head>
    <p id  =  a:b center>
    <span / hello </span>
    &amp<br left>
    <!---- >t<!---> < -->
    &e link </a>
</body>

Не говоря уже обо всем определенном для браузера парсинге для недопустимых конструкций.

Удача, делающая ямки regex против этого!

РЕДАКТИРОВАНИЕ (Jörg W Mittag): Вот другая хорошая часть правильно построенного, допустимого HTML 4.01:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML/
  <HEAD/
    <TITLE/>/
    <P/>
259
ответ дан 22 November 2019 в 23:42
поделиться

На самом деле

<img src="imgtag.gif" alt="<img>" />

не допустимый HTML и не допустимый XML также.

Это не допустимый XML, потому что' <' и'>' не допустимые символы в строках атрибута. Их нужно оставить с помощью соответствующих объектов XML &lt; и &gt;

Это не допустимый HTML также, потому что короткая заключительная форма не позволяется в HTML (но корректно в XML и XHTML). Тег 'img' является также неявно закрытым тегом согласно спецификации HTML 4.01. Это означает, что вручную закрытие его является на самом деле неправильным, и является эквивалентным закрытию любого другого тега дважды.

Правильная версия в HTML

<img src="imgtag.gif" alt="&lt;img&gt;">

и правильная версия в XHTML и XML

<img src="imgtag.gif" alt="&lt;img&gt;"/>

Следующий пример, который Вы дали, также недопустим

<
tag
attr="5"
/>

Это не допустимый HTML или XML также. Название тега должно быть правильным позади' <', хотя атрибуты и закрытие'>' могут быть то, везде, где они хотят. Таким образом, допустимый XML на самом деле

<tag
attr="5"
/>

И вот является другой более броским: можно на самом деле принять решение использовать или "или 'в качестве символа заключения в кавычки атрибута

<img src="image.gif" alt='This is single quoted AND valid!'>

Все другие причины, которые были отправлены, корректны, но самая большая проблема с парсингом HTML состоит в том, что люди обычно не понимают всех синтаксических правил правильно. То, что Ваш браузер интерпретирует Ваш tagsoup как HTML, не делает средств, что Вы на самом деле записали допустимый HTML.

Править: И даже stackoverflow.com соглашается со мной относительно определения допустимых и недопустимых. Ваш недопустимый XML/HTML не выделяется, в то время как моя исправленная версия.

В основном XML не сделан быть проанализированным с regexps. Но нет также никакой причины сделать так. Существуют многие, много синтаксических анализаторов XML для каждого языка. У Вас есть выбор между синтаксическими анализаторами SAX, синтаксическими анализаторами DOM и синтаксическими анализаторами Получения по запросу. Все они, как гарантируют, будут намного быстрее, чем парсинг с regexp, и можно затем использовать прохладные технологии как XPath или XSLT на получающемся дереве DOM.

Мой ответ поэтому: не только анализирует XML с regexps трудно, но и это - также плохая идея. Просто используйте один из миллионов существующих синтаксических анализаторов XML и используйте в своих интересах все расширенные функции XML.

HTML просто слишком трудно даже попытаться анализировать самостоятельно. Сначала легальный синтаксис имеет много небольшой тонкости, о которой Вы не можете знать, и во-вторых, HTML в дикой природе является просто огромной зловонной грудой (Вы получаете мой дрейф). Существует множество слабых библиотек синтаксического анализатора, которые делают хорошее задание при обработке HTML как суп тега, просто используют их.

70
ответ дан 22 November 2019 в 23:42
поделиться

Я записал всю запись в блоге на этом предмете: Ограничения Регулярного выражения

Затруднение проблемы - то, что HTML и XML являются рекурсивными структурами, которые требуют механизмов подсчета для надлежащего парсинга. Истинный regex не способен к подсчету. У Вас должна быть контекстно-свободная грамматика для подсчета.

Предыдущий абзац идет с небольшим протестом. Определенные regex реализации теперь поддерживают идею рекурсии. Однако, после того как Вы начинаете добавлять рекурсию в свои regex выражения, Вы действительно расширяете границы и должны рассмотреть синтаксический анализатор.

56
ответ дан 22 November 2019 в 23:42
поделиться

Один глюк не в Вашем списке - то, что атрибуты могут появиться в любом порядке, поэтому если Ваш regex ищет ссылку с href "нечто" и классом "панель", они могут существовать любого порядка и иметь любое количество других вещей между ними.

20
ответ дан 22 November 2019 в 23:42
поделиться

Это зависит от того, что Вы подразумеваете под "парсингом". Вообще говоря, XML не может быть проанализирован с помощью regex, так как грамматика XML ни в коем случае не является регулярной. Для помещения его просто regexes не может рассчитать (хорошо, Perl regexes мог бы на самом деле смочь считать вещи), таким образом, Вы не можете сбалансировать открыто-близкие теги.

16
ответ дан 22 November 2019 в 23:42
поделиться

Люди на самом деле делают ошибку при помощи regex, или это просто достаточно хорошо для задачи, которой они пытаются достигнуть?

Я полностью соглашаюсь, что, анализируя HTML и xml использование regex не возможно, как ответили другие люди.

Однако, если Ваше требование не должно анализировать html/xml, но просто достигать один маленький бит данных в "известном хорошем" бите HTML / xml затем, возможно, регулярное выражение или даже еще более простая "подстрока" достаточно хороши.

9
ответ дан 22 November 2019 в 23:42
поделиться

Люди обычно значение по умолчанию к записи жадных шаблонов, достаточно часто ведя к непродуманному.*, хлебающему большие блоки файла в самое большое <нечто>.* </foo>.

6
ответ дан 22 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: