2015-01-22 2 views
4

Я сделал это регулярное выражение, чтобы получить все атрибуты в теге «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` 
+5

Просто возьмите DOM парсер. – zerkms

+0

[Не анализировать HTML с регулярным выражением!] (Http://stackoverflow.com/a/1732454/418066) – Biffen

ответ

7

Я предлагаю вам использовать \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 
) 
+0

Он не работает с атрибутами данных, такими как 'data-' или даже 'src-set'. Не избегайте символа '-'. – hosein

+1

@hosein simple, добавьте '-' внутри первой группы захвата https://www.regex101.com/r/tI8nV7/27 –

2

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

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

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

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

+0

В качестве побочного примечания вы можете использовать что-то вроде'/([\ w \ - ] +) = ([^ "']] + | (['"]?) (?: [^ \ 3] | \ 3 +) +? \ 3)/', которая соответствует' attr = value', 'attr = 'значение'', 'attr =' значение" значение "'', 'attr =" значение "', 'attr =' regex 'r' us '', 'attr =" другое "", 'attr =" различные разделители, пока не будет найдено одно действительное [...] 'и несколько разных комбинаций. Но это может не сработать. Если был добавлен из моего комментария (http://stackoverflow.com/questions/27988667/how-to-select-image-src-using-php/27988904?noredirect=1#comment44369639_27988904) в другом ответе. Вы можете проверить его здесь: https://regex101.com/r/sT9rT8/1 –

+0

Кроме того, вы не можете использовать '(\ w +)' в первой группе, так как 'data-value' не будет совпадать. Вместо этого используйте '([\ w \ -] +)'. –

+0

Извините за беспокойство, я попытался отредактировать другой комментарий, но уже слишком поздно. Настоящим рабочим регулярным выражением является следующее: '([\ w \ -] +) = ([^" ']] + | ([' "]?) (?: [^ \ 3] | \ 3 +) +? \ 3) ', и вы можете проверить здесь: https://regex101.com/r/sT9rT8/2 –

Смежные вопросы