RegEx для извлечения свойств изображения HTML

Мне нужен шаблон RegEx для извлечения всех свойств тега изображения.

Как мы все знаем, существует множество искаженных HTML-кодов, поэтому шаблон должен учитывать эти возможности.

Я смотрел на это решение https://stackoverflow.com/questions/138313/how-to-extract-img-src-title-and-alt-from-html-using-php, но он не совсем понял его:

Я придумываю что-то вроде:

(alt|title|src|height|width)\s*=\s*["'][\W\w]+?["']

Есть ли какие-то возможности, которые мне не хватает, или более эффективный простой шаблон?

Обновлено:
Извините, я буду более конкретным, я делаю это с помощью .NET, поэтому он находится на стороне сервера.
У меня уже есть список тегов img, теперь мне просто нужно проанализировать свойства.

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

Tomalak 08.12.2008 20:46
Остерегайтесь Залго
Kelly S. French 13.01.2012 02:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
2 132
6

Ответы 6

As we all know, there are lots of malformed HTML out there, so the pattern has to cover those possibilities.

Не будет. Используйте парсер HTML, если вам нужно разобрать «злой» (из неизвестного источника) HTML.

Если вам нужны значения атрибута все, могу ли я предложить использовать DOM? Что-то вроде element.attributes подойдет.

Если вы настаиваете на регулярном выражении, //\b\w+ = "[^"]+"// должен получить все.

Если производительность не является большой проблемой, я бы пошел с парсером html (например, BeautifulSoup в python), если вы делаете это на стороне сервера, или jquery, или просто javascript, если вы делаете это на стороне клиента. Конечно, это перебор, но он намного быстрее, с меньшей вероятностью будет содержать ошибки (так как они подумали о крайних случаях), и он справится с потенциальной некорректностью.

Лучше всего использовать что-то вроде Пакет гибкости HTML вместо использования регулярного выражения. Он предназначен для обработки большого количества случаев и может сэкономить вам больше, чем несколько головных болей, благодаря выбиванию крайних корпусов.

Прежде чем использовать регулярное выражение, посмотрите, что он умеет: RegEx сопоставляет открытые теги, кроме автономных тегов XHTML.

/<img(\s+([a-z]{3,})=(["']([^"']*)["']|[\S]))+\s*/?>/i

Будет возвращено match_all (формат зависит от вашей библиотеки, но ключевые индексы есть):

0 -> image tag
1 -> attribute
2 -> attribute name
3 -> attribute value (with enclosing quotes if exists)
4 -> attribute value (without enclosing quotes if it has them, otherwise empty, use 3)

Другие вопросы по теме