Странное поведение жадного квантификатора

307
19 февраля 2017, 11:58

В общем, имеется код регулярного выражения для парсинга атрибутов HTML тегов. Так вот, по какой-то причине не срабатывает отключение жадного поиска, я по разному пробовал ... Странная бесовщина творится, уже все волосы повыдергивал.

preg_match('~
<
 ([a-z0-9]+) #Получаем название тега
 \s*
 (?:[a-z_-]+="(.*?)")* #ВОТ здесь проблемное место! Этот кусок кода парсит все атрибуты
>
~xs', '<div id="test_id" class="test_clas">', $parts);
print_r($parts);

Нужно чтобы в массиве $parts находился список атрибутов, что-то вроде этого:

array(
'id' => 'test_id'
'class' => 'test_class'
)

То-есть, чтобы можно было получить отдельно название атрибута и его содержимое, а сейчас все атрибуты одной строчкой !!!

UPD: Немного подправил код, изменил вот эту строчку: (?:([a-z_-]+)="(.*?)"\s*)* а именно, добавил вот этот кусочек \s* Код работает как нужно, вот только находит самый последний атрибут, затирая первый. Как-то можно исправить сей недуг?

Answer 1

Вы с помощью preg_match() хотите найти неопределенное количество совпадений?

Вам нужно сначала найти тег, а уже потом искать в найденом неопределенное количество атрибутов с помощью preg_match_all()

А вообще, согласен с Sublihim. Для вашей задачи лучше подойдет html-пассер

READ ALSO
Как зайти и настроить админку в laravel?

Как зайти и настроить админку в laravel?

Пытаюсь сделать админку SleepingOwl (http://sleeping-owlgithub

670
Обратимый xor на php

Обратимый xor на php

Здравствуйте! Нужна ваша помощь в решении одной задачкиЕсть три переменные:

357
Загрузка аудиозаписи в вк,через api

Загрузка аудиозаписи в вк,через api

Доброго времени суток! Мне необходимо загрузить аудиофайл (wav) в документы ВКонтакте

382
Не выполняется код в сокращенной версии тега PHP

Не выполняется код в сокращенной версии тега PHP

Обновил сервер и теперь код обернутый в <? ?> перестал выполнятьсяКак подправить?

371