Как получить все атрибуты с помощью регулярных выражений?

Я сделал это регулярное выражение, чтобы получить все атрибуты в теге «IMG».

 /<img\s+(?:([a-z_-]+)\s*=\s*"(.*?)"\s*)*\s*\/>/g

Но это только один атрибут, который является последним.

Как я могу получить все атрибуты с помощью регулярных выражений?

Тестовая строка:

 <img src="abc.png" alt="abc" />
<img alt="def" src="def.png" />
<img src="abc.png" alt="abc" style="border:none" />
<img alt="def" src="def.png" style="border:none" />

Результат: (с http://www.regex101.com)

 MATCH 1
1. [19-22] `alt`
2. [24-27] `abc`

MATCH 2
1. [47-50] `src`
2. [52-59] `def.png`

MATCH 3
1. [93-98] `style`
2. [100-111]   `border:none`

MATCH 4
1. [145-150]   `style`
2. [152-163]   `border:none`

4

Решение

Я предлагаю вам использовать \G Якорь для того, чтобы сделать непрерывное совпадение строк.

(?:<img|(?<!^)\G)\h*([\w-]+)="([^"]*)"(?=.*?\/>)

Получить атрибут из группового индекса 1 и получить значение из группового индекса 2.

DEMO

$string = <<<EOT
<img src="abc.png" alt="abc" />
<img alt="def" src="def.png" />
<img src="abc.png" alt="abc" style="border:none" />
<img alt="def" src="def.png" style="border:none" />
EOT;
preg_match_all('~(?:<img|(?<!^)\G)\h*(\w+)="([^"]+)"(?=.*?\/>)~', $string, $match);
print_r($match[1]);
print_r($match[2]);

Выход:

Array
(
[0] => src
[1] => alt
[2] => alt
[3] => src
[4] => src
[5] => alt
[6] => style
[7] => alt
[8] => src
[9] => style
)
Array
(
[0] => abc.png
[1] => abc
[2] => def
[3] => def.png
[4] => abc.png
[5] => abc
[6] => border:none
[7] => def
[8] => def.png
[9] => border:none
)
7

Другие решения

Попробуй это:

/(\w+)=["']([a-zA-Z0-9_.:'"]+)["']/

Помните, что если вы используете это с php, опция g не поддерживается, используйте функцию preg_match_all ()

Попробуйте это на: https://regex101.com/r/cQ8jT2/1

2

По вопросам рекламы [email protected]