Во-первых, стандартный отказ от ответственности: если вы используете регулярные выражения для анализа HTML DOM, вы ДЕЛАЕТЕ НЕПРАВИЛЬНО .Со всеми структурированными данными (XML, JSON и т. Д.) Правильный способ анализа HTML состоит в том, чтобы использовать что-то, созданное для этой цели, и запрашивать его, используя систему запросов.
Тем не менее, часто этона тот случай, если вам нужен быстрый взлом командной строки или поля поиска редактора или чего-либо еще, и вам не нужно или не нужно отказываться от написания приложения, загружаемого в библиотеки DOM-синтаксического анализа.
В этом случае, если вы на самом деле не пишете программу и не возражаете против того, что существуют крайние случаи, когда любое регулярное выражение, которое вы пытаетесь сломать, рассмотрите что-то вроде этого:
/<img\b[^<>]+\bsrc\s*=\s*"([^"]+)"/i
... возможно, заменив начальный /
и завершающий /i
любым другим, что ваш язык использует для обозначения регистрозависимого регулярного выражения.
Обратите внимание, что это делает предположения, что URL заключен в двойные кавычки,тег сформирован правильно, в документе нет посторонних строк <img
, в URL нет двойных кавычек и множество других, которыеЯ не думал о, но правильный парсер будет.Эти предположения являются большой частью того, почему использование синтаксического анализатора так важно: он не делает таких предположений, и, если его накормить, правильно сообщит вам, что вы это сделали, вместо того, чтобы пытаться переварить его и причинить вам боль в дальнейшем.
<img\b
- тег img.Граница слова гарантирует, что это не тег imgur или что-то в этом роде. [^<>]+
- один или несколько символов без закрывающего тега, а для безопасности также нет открывающих тегов. \bsrc\s*=\s*
- 'src =', но с необязательным пробелом и другой проверкой границы слова. "([^"]+)"
- некоторый URL, состоящий из символов, не заключенных в кавычки, внутри кавычек.
Теперь учтите, что, поскольку мы НЕ проводим проверку безопасности URL-адреса, вы можете получить что-нибудь, например javascript:...something malicious...
, или его длина может составлять 6 ГБ - вы просто не знаете.Вы можете добавить проверку таких вещей, но вы всегда будете что-то пропустить, если только вы не контролируете ввод и не знаете точно, что вы анализируете.
Ваше упоминание о «моем приложении» действительно означает, что я должен повторить: приведенное выше почти наверняка является неправильным способом , чтобы сделать это, если вы пишете приложение, и вопрос, который вы должны задать, вероятно, ближе к тому, "как"получить значение атрибута src тега img со страницы HTML на выбранном мной языке программирования? "а не «как я могу использовать регулярные выражения для извлечения этого токена из этого HTML-тега?»
Когда я говорю это, я не имею в виду «компьютерные ученые из слоновой кости будут смотреть на вас своими носами» - хотяЯ допускаю, что в программировании может быть много такого рода издевательств: D
Я имею в виду нечто более похожее на ... "Вы настраиваете себя на боль, сталкиваясь с крайним случаем после крайнего случаяи сверните в глубокую кроличью нору бесконечного совершенствования своего регулярного выражения. И вы, вероятно, сможете избежать боли с помощью простого однострочного, бесконечно приятнее регулярного выражения, возможно, document.querySelector('img[src^="/directory/Images"]')
, как предлагает @LGSon в комментарии.
Люди скажут это, потому что у них была эта боль, и они морщатся от мысли, что вы тоже можете страдать от этого.