Задать вопрос
@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 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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. Вам никто не гарантирует как наличие, так и порядок аттрибутов в тэге.
Ответ написан
Комментировать
Меня искренне удивляют люди пихающие всё в одну регулярку. Спарсите < img(.*?)> отдельно и из него спокойно достаньте src=\"(.*?)\" title=\"(.*?)\"
Ответ написан
Комментировать
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
последний / не заэкранировали.
надо \/

<img.*?(?:(?:\s+(src)="([^"]+)")|(?:\s+(title)="([^"]+)")|(?:\s+(alt)="([^"]+)")|(?:\s+[^\s]+))+.*\/>
Ответ написан
Комментировать
ravshanium
@ravshanium
аналитик, веб-программист
ваше регулярное выражение хорошо бы использовать таким образом:
for($i=1; $i< count($matches)-1; $i++){
   $var = $matches[$i][0];
 $$var = $matches[$i+1][0];
}

var_dump($src, $title, $alt);


Учитывая что порядок атрибутов может меняться местами - это будет работать...

codepad.viper-7.com/douGqC
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы