Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems. /Jamie Zawinski
Студия Артемия Лебедева опубликовала валидатор XML, построенный на регекспах.
В то время как каждый студент, прослушавший курс «Теория программирования», «Теория вычислений» или аналогичный, должен знать, что грамматики делятся на регулярные, контекстно-свободные, контекстно-зависимые и общего вида. Причём между языками, порождаемыми этими классами, существует иерархия вложения — LR ⊂ LCF ⊂ LCD ⊂ L, причём все отношения включения — строгие (то есть для каждых двух соседних классов существует пример языка, описываемого более мощным и не описываемого менее мощным).
Так вот, регулярные выражения способны разобрать лишь регулярные языки. А грамматика XML — контекстно-свободная.
Я не вчитывался внимательно в весь код, но, как минимум, <!DOCTYPE>
может согласно их валидатору находиться в любом месте и в любых количествах. Кроме того, они упорно используют во всех регекспах конструкцию [a-z_][\w:-]*
, в то время как по спецификации имя должно начинаться с Буквы (включая латинский, греческий, кириллический, армянский, еврейский, арабский, бенгальский, тамильский, тайский, лаосский, тибетский, грузинский алфавит, деванагари, гурмукхи, гуджарати, ория, телугу, каннада, малаялам, хангыль, хирагану, катакану и чжуинь, а также китайские/японские иероглифы) и может содержать точки, двоеточия, подчёркивания, дефисы, Буквы, Цифры (европейские, арабо-индийские, деванагари, бенгальские, гурмукхи, гуджарати, ория, тамильские, телугу, каннада, малаялам, тайские, лаосские и тибетские), Комбинирующуюся диакритику и Экстендеры. (Для любопытных: нет, в ECMAScript эскейп \w
не матчит все эти экзотические алфавиты — он эквивалентен тупо [A-Za-z0-9_]
.)
Мораль отсюда такова: определить, является ли текст корректным и/или валидным XML можно лишь пропустив его через настоящий парсер.