Page 280 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 280
Выглядит малопонятно, как абракадабра, не так ли? Для меня тоже. Но в этом
примере заключено столько мощи, что на нем стоит остановиться и рассмотреть его
подробно. Начнем с не захватываемой группы: ( ? : h ttps ? ) ?. Обратите внимание
на два метасимвола повторения "ноль или один': Первый говорит, что "s опциональ
но". Помните, что символы повторения обычно относятся только к тому символу,
который расположен непосредственно перед ними (т.е. слева от них). Второй отно
сится ко всей гр уппе, расположенной слева от него. Таким образом, все вместе это
выражение будет распознавать пустую строку (нулевое количество http?), http или
https. Далее мы распознаем две косые черты (обратите внимание, мы экранируем их
\
обратной косой чертой: / \ / ). Затем следует довольно сложный символьный класс.
Вполне очевидно, что имена доменов могут содержать буквы и цифры, но в них так
же могут встречаться дефисы (но начинаться они должны с буквы и не могут закан
чиваться дефисом).
Этот пример далеко не совершенен. Например, он распознал бы URL / / gotcha
a
(глюк) без домена верхнего уровня, точно так же, как и / /v l i d . сот. Однако рас
познавание полностью правильных URL - намного более сложная задача, решать
которую пока что нам не зачем.
Если вы сыты по горло всеми этими недостатками ("наш пример рас
познает некорректные URL"), знайте, что вы не обязаны делать все
и сразу! Фактически для решения подобной задачи при сканировании
веб-сайтов я использую очень похожее регулярное выражение. Сначала
я просто собираю все URL (или похожие на URL), а затем делаю вто
рую фазу анализа, чтобы отбросить недопустимые или нерабочие URL
и т.п. Не увлекайтесь слишком созданием совершенных регулярных вы
ражений, которые учитывают каждый вообразимый случай. Мало того
что иногда это невозможно, но зачастую, даже когда теоретически воз
можно, требует ненужных усилий. Очевидно, иногда уместно или даже
нужно рассматривать все варианты, например когда вы просеиваете
пользовательский ввод для предотвращения атак методом инъекции.
В таком случае вам понадобится проявить дополнительные усилия
и сделать свое регулярное выражение "пуленепробиваемым':
Л е н и вое и жадное распознавания
Что отличает дилетантов в регулярных выражениях от профессионалов - так это
понимание преимуществ ленивых соответствий перед жадными. Регулярные выра
жения стандартно являются жадными (greedy), т.е. они будут распознавать макси
мально возможную строку перед остановкой. Рассмотрим классический пример.
Ленивое и жадное распознавания 283

