как вернуть соответствие регулярному выражению в php вместо замены

Я пытаюсь извлечь первый атрибут src изображения в блоке текста HTML следующим образом:

Lorem ipsum <img src="http://example.com/img.jpg" />consequat.

У меня нет проблем с созданием регулярного выражения для соответствия атрибуту src, но как мне вернуть первый совпадающий атрибут src вместо его замены?

Изучая руководство по PHP, кажется, что preg_filter() подойдет трюк, но я не могу полагаться на конечных пользователей, имеющих PHP > 5.3.

Все остальные функции регулярных выражений PHP кажутся вариациями preg_match(), возвращающей логическое значение, или preg_replace, которая заменяет совпадение на что-то. Есть ли простой способ вернуть соответствие регулярному выражению в PHP?


person Jared Henderson    schedule 11.11.2009    source источник


Ответы (1)


Вы можете использовать третий параметр preg_match, чтобы узнать, что соответствует (это массив, передаваемый по ссылке ) :

int preg_match  ( string $pattern  , 
    string $subject  [, array &$matches  [, 
    int $flags  [, int $offset  ]]] )

Если есть совпадения, то он заполняется результатами поиска. $matches[0] будет содержать текст, соответствующий полному шаблону, $matches[1] будет содержать текст, соответствующий первому захваченному подшаблону в скобках, и так далее.


Например, с помощью этой части кода:

$str = 'Lorem ipsum dolor sit amet, adipisicing <img src="http://example.com/img.jpg" />consequat.';

$matches = array();
if (preg_match('#<img src="(.*?)" />#', $str, $matches)) {
    var_dump($matches);
}

Вы получите этот вывод:

array
  0 => string '<img src="http://example.com/img.jpg" />' (length=37)
  1 => string 'http://example.com/img.jpg' (length=23)

(Обратите внимание, что мое регулярное выражение слишком упрощено, и это регулярное выражение, как правило, не является «правильным инструментом», когда дело доходит до извлечения данных из какой-либо строки HTML...)

person Pascal MARTIN    schedule 11.11.2009
comment
отлично, спасибо. Кстати, какой инструмент подходит для извлечения данных из строки HTML? - person Jared Henderson; 11.11.2009
comment
пожалуйста :-) ;; это сложный вопрос ^^ Если у вас есть полный HTML-документ, мне нравится идея использования DOMDocument::loadHTML (см. stackoverflow.com/questions/1274020/ для некоторых мыслей, которые я опубликовал некоторое время назад) - но есть и другие решения - person Pascal MARTIN; 11.11.2009