Если вам нужно найти только открывающие теги, вы можете использовать следующее регулярное выражение, которое будет записывать тип тега как $ 1 (a или img), а содержимое (включая закрывающий тег, если таковой имеется) как $ 2:
(?:<(a|img)(?:\s[^>]*)?>)((?:(?!<\1)[\s\S])*)
Если у вас также есть закрывающий тег, вы должны использовать следующее регулярное выражение, которое будет записывать тип тега как $ 1 (a или img), а содержимое как $ 2:
(?:<(a|img)(?:\s[^>]*)?>)\s*((?:(?!<\1)[\s\S])*)\s*(?:<\/\1>)
В основном вам просто нужно использовать функцию заменына одном из приведенных выше регулярных выражений и верните $ 2, чтобы получить то, что вы хотели.
Краткое объяснение запроса:
( )
- используется для захвата всего, что соответствует регулярному выражению в скобках.Порядок захвата следующий: $ 1, $ 2 и т. Д. ?:
- используется после открывающей скобки "(", чтобы не захватывать содержимое внутри скобок. \1
- копирует захват номер 1. Это тип тега. Мне нужно было захватить тип тега, чтобы закрывающий тег соответствовал открывающему, а не что-то вроде: <img src=""> </a>
. \s
- это пробел, поэтому после открытия тега <img
будет как минимум 1 пробел в случае наличия атрибутов (например, он не будет соответствовать <imgs>
). [^>]*
- isищет что-либо, кроме символов внутри, что в данном случае равно >
, а *
означает неограниченное количество раз. ?!
- ищет что-либо, кроме строки внутри, что-то вроде [^>]
только для строки вместо одиночных символов. - [\ s \ S] - используется почти как
.
, но допускает любые пробелы (которые также будут совпадать в случае появления новых строк между тегами).вы используете регулярное выражение "s", тогда вы можете использовать .
вместо.
Пример использования с закрывающим тегом: https://regex101.com/r/MGmzrh/1
Пример использования без закрывающего тега: https://regex101.com/r/MGmzrh/2
Regex101 также имеет некоторые объяснения того, что я сделал:)