У меня есть строка исходного кода, похожая на эту

 <img alt="this field is variable" title="this one too" itemprop="photo" border="0" style="width:608px;" src="imgurl.jpg">

На сайте много других изображений, поэтому я не могу просто preg_match все изображения, мне нужно конкретное, у меня было много проблем с конкретным preg_match, потому что содержимое тега alt и title - тег переменный. Кто-нибудь знает, как это сделать? Заранее спасибо.

Itemprop = "photo" - уникальная вещь для этого изображения.

0
Imbue 10 Апр 2014 в 17:30

2 ответа

Лучший ответ

Это регулярное выражение должно работать:

preg_match('/<img[^>]*itemprop="photo"[^>]*src="([^"]+)">/',$source,$matches);

Объяснение регулярного выражения (из regex101):

Explanation of the regex

Результат будет в массиве $matches.

3
L3viathan 11 Апр 2014 в 00:53

Использование регулярного выражения для синтаксического анализа HTML не очень хорошо. Почему бы не использовать DOMDocument для поиска своих элементов? В PHP есть эти объекты для синтаксического анализа HTML-документа и изучения элементов намного проще, чем использовать регулярное выражение для их поиска. Тогда вы также сможете намного проще манипулировать HTML, в зависимости от того, чего вы пытаетесь достичь.

$dom = new DOMDocument();
$dom->loadHTML(<your html string>);

$imgs = $dom->getElementsByTagName('img');
$photos = [];
foreach($imgs as $img) {
      if($img->attributes->getNamedItem('itemprop') && $img->attributes->getNamedItem('itemprop')->nodeValue = 'photo') {
         $photos[] = $img->attributes->getNamedItem('src')->nodeValue;
     }
}

Этот код предоставит вам массив с атрибутом src объекта imgs, у которого есть ваше свойство, и вы не зависите от того, как создаются элементы или что-либо в фактическом тексте html.

0
Community 23 Май 2017 в 12:30