Это мой лучший RegEx для извлечения свойств в теге HTML:
# Обрезать совпадение внутри кавычек (одинарных или двойных)
(\S+)\s*=\s*([']|["])\s*([\W\w]*?)\s*\2
# Без отделки
(\S+)\s*=\s*([']|["])([\W\w]*?)\2
Плюсы:
- Вы можете обрезать содержимое внутри кавычек.
- Соответствует всем специальным символам ASCII внутри кавычек.
- Если у вас есть title = "Ты мой", RegEx не нарушается
Минусы:
- Возвращает 3 группы; сначала свойство, затем кавычка ("| ') и в конце свойство внутри кавычек, т. е.
<div title="You're">
результат - группа 1: заголовок, группа 2:", группа 3: вы.
Это онлайн пример RegEx:
https://regex101.com/r/aVz4uG/13
Я обычно использую этот RegEx для извлечения тегов HTML:
Я рекомендую это, если вы не используете тип тега, такой как <div
, <span
и т. Д.
<[^/]+?(?:\".*?\"|'.*?'|.*?)*?>
Например:
<div title="a>b=c<d" data-type='a>b=c<d'>Hello</div>
<span style="color: >=<red">Nothing</span>
# Returns
# <div title="a>b=c<d" data-type='a>b=c<d'>
# <span style="color: >=<red">
Это онлайн пример RegEx:
https://regex101.com/r/aVz4uG/15
Ошибка в этом RegEx:
<div[^/]+?(?:\".*?\"|'.*?'|.*?)*?>
В этом теге:
<article title="a>b=c<d" data-type='a>b=c<div '>Hello</article>
Возвращает <div '>
, но не должно совпадать:
Match: <div '>
Чтобы «решить» это, удалите шаблон [^/]+?
:
<div(?:\".*?\"|'.*?'|.*?)*?>
Ответ # 317081 хорош, но не соответствует этим случаям:
<div id="a"> # It returns "a instead of a
<div style=""> # It doesn't match instead of return only an empty property
<div title = "c"> # It not recognize the space between the equal (=)
Это улучшение:
(\S+)\s*=\s*["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))?[^"']*)["']?
против
(\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?
Избегайте пробелов между одинаковыми сигналами:
(\ S +) \ с * = \ с * ((?: ...
Измените последние + и. за:
|? [> "']?)) [^" '] *) [ "']
Это онлайн пример RegEx:
https://regex101.com/r/aVz4uG/8