Задать вопрос
@SeiLove

Ошибка в регулярном выражении?

Хочу разбить строку - чтобы юрл отдельно, название отдельно, описание отдельно.
$content =  '<img src="/image/fluffybunny.jpg" title="Тайтл" alt="Деск" />';
$image   =  preg_match_all('<img.*?(?:(?:\s+(src)="([^"]+)")|(?:\s+(title)="([^"]+)")|(?:\s+(alt)="([^"]+)")|(?:\s+[^\s]+))+.*/>', $content, $matches);

for ($i=0; $i< count($matches[0]); $i++) {
  echo "Адрес страницы: " . $matches[0][$i] . "\n";
  echo "Название: " . $matches[1][$i] . "\n";
  echo "Описание: " . $matches[3][$i] . "\n";
}


Почему-то строка парсится неправильно и выдаёт:
" Адрес страницы: img src="/image/fluffybunny.jpg" title="Тайтл" alt="Деск" / Название: src Описание: title "
Может кто-нибудь увидит в чём ошибка?
  • Вопрос задан
  • 148 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя Алексей Ostin К ответам на вопрос (4)
stackoverflow.com/questions/1732348/regex-match-op...

Используйте любой доступный xml-парсер, например, simple_html_dom. С ним ваша конструкция будет простая и читаемая:
foreach($html->find('img') as $img) {
      echo "Адрес страницы: " . $img->src . "\n";
      echo "Название: " . $img->title . "\n";
      echo "Описание: " . $img->alt . "\n";
}

Вариант с регулярным выражением корректнее было бы записать в виде получения пар ключ-значение и дальнейшей обработкой полученных данных: https://regex101.com/r/aS7qG0/1. Вам никто не гарантирует как наличие, так и порядок аттрибутов в тэге.
Ответ написан
Комментировать