Использование preg_replace_callback () для извлечения всех изображений из строки HTML - PullRequest
2 голосов
/ 29 марта 2011

Сложная функция preg_replace_callback здесь - по общему признанию, я не очень хорош в выражениях PRCE.

Я пытаюсь извлечь все значения img src из строки HTML, сохранить значения img src в массив и дополнительно заменить путь img src на локальный (не удаленный). Т.е. я мог бы, окруженный множеством других HTML:

img src = 'http://www.mysite.com/folder/subfolder/images/myimage.png'

И я бы хотел извлечь myimage.png в массив и дополнительно изменить src на:

SRC = 'изображения / myimage.png'

Можно ли это сделать?

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Нужно ли использовать регулярные выражения?Обработка HTML обычно проще с помощью функций DOM:

<?php

$domd = new DOMDocument();
libxml_use_internal_errors(true);
$domd->loadHTML(file_get_contents("http://stackoverflow.com"));
libxml_use_internal_errors(false);

$items = $domd->getElementsByTagName("img");
$data = array();

foreach($items as $item) {
  $data[] = array(
    "src" => $item->getAttribute("src"),
    "alt" => $item->getAttribute("alt"),
    "title" => $item->getAttribute("title"),
  );
}

print_r($data);
1 голос
/ 29 марта 2011

Вам нужно регулярное выражение для этого? Не обязательно. Являются ли регулярные выражения наиболее читаемым решением? Вероятно, нет - по крайней мере, если вы не владеете регулярным выражением. Являются ли регулярные выражения более эффективными при сканировании больших объемов данных? Безусловно, регулярные выражения компилируются и кэшируются при первом появлении. Выигрывает ли регулярное выражение трофей "наименьшего количества строк кода"?

$string = <<<EOS
<html>
<body>
blahblah<br>
<img src='http://www.mysite.com/folder/subfolder/images/myimage.png'>blah<br>
blah<img src='http://www.mysite.com/folder/subfolder/images/another.png' />blah<br>
</body>
</html>
EOS;

preg_match_all("%<img .*?src=['\"](.*?)['\"]%s", $string, $matches);
$images = array_map(function ($element) { return preg_replace("%^.*/(.*)$%", 'images/$1', $element); }, $matches[1]);

print_r($images);

Две строки кода, которые трудно подрезать в PHP. В результате получается следующий массив $images:

Array
(
  [0] => images/myimage.png
  [1] => images/another.png
)

Обратите внимание, что это не будет работать с версиями PHP до 5.3, если вы не замените анонимную функцию правильной.

...