как да върна съвпадение на regex в 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