PHP preg_match возвращает только (. *?) Значение? - PullRequest
0 голосов
/ 30 января 2012

Изо всех сил пытается получить preg match, чтобы вернуть только URL изображения, а не всю совпавшую строку.Нужно ли использовать preg_replace после или это становится хакерским?

Возможно, другой синтаксис даст мне то, что мне нужно?

Спасибо!

$source = file_get_contents('http://mysite.co.uk');
preg_match_all("'<div id=\"my-div\"><img src=\"(.*?)\" /></div>'", $source, $match);
echo $match[0][0]; 

Ответы [ 3 ]

3 голосов
/ 30 января 2012

Если вы используете echo $match[0][0], у вас будет весь текст.

<div id="my-div"><img src="blabla bla" /></div>

Если вы вместо этого напишите $match[1][0], вы получите совпадение подшаблона:

blabla bla
1 голос
/ 30 января 2012

По умолчанию preg_match_all всегда возвращает полностью совпадающую строку в качестве первого элемента (используя тип заказа PREG_PATTERN_ORDER).

Из документов для PREG_PATTERN_ORDER:

Упорядочивает результаты так, что $ match [0] - это массив полных совпадений с шаблоном, $ match 1 - это массив строк, сопоставленных с первым подшаблоном в скобках, и т. Д.

Если вы ищете значение группы захвата, проверьте значение по индексу 1, а затем используйте ссылку на группу захвата в качестве податрибута.

Например, группа захвата1 будет: $matches[ 1 ][ 0 ]

Чтобы изменить это поведение, вы можете передать в качестве третьего аргумента константу, такую ​​как PREG_SET_ORDER, которая "Заказывает результаты так, что $ match [0] является массивом первогонабор совпадений, $ match 1 - массив второго набора совпадений и т. д. "

1 голос
/ 30 января 2012

Если вы ищете первый экземпляр, вам не нужно использовать preg_match_all():

$source = file_get_contents('http://mysite.co.uk');
if (preg_match('#<div id="my-div"><img src="(.*?)" /></div>#', $source, $match)) {
    echo $match[1];
} else {
    // no match found
}

Обратите внимание, что это регулярное выражение не будет совпадать для нескольких строк.

Редактировать: Если вам нужно все совпадения, то вы были на правильном пути, но вы использовали индекс 0 вместо 1, поэтому:

preg_match_all(..., $match);
foreach ($match as $m) {
    echo $m[1]; // Use 1 here instead of 0; 1 is the first capture group, where 0 is the entire matched string
}
...