使用preg_replace_callback()从HTML字符串中提取所有图像

时间:2011-03-29 14:19:52

标签: php regex preg-replace preg-replace-callback

这里有棘手的preg_replace_callback函数 - 我无疑在PRCE表达方面表现不佳。

我试图从HTML字符串中提取所有img src值,将img src值保存到数组中,另外将img src路径替换为本地路径(不是远程路径)。即我可能有,包围了很多其他HTML:

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

我想将myimage.png解压缩到一个数组,并另外将src更改为:

SRC = '图像/ myimage.png'

能做到吗?

由于

2 个答案:

答案 0 :(得分:3)

是否需要使用正则表达式?使用DOM函数处理HTML通常更容易:

<?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 :(得分:1)

你需要正则表达式吗?不必要。正则表达式是最易读的解决方案吗?可能不是 - 至少除非你能说流利的正则表达式。扫描大量数据时,正则表达式更有效吗?绝对地,正则表达式在首次出现时被编译和缓存。正则表达式赢得了“最少的代码行”奖杯吗?

$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
)

请注意,这不适用于5.3之前的PHP版本,除非您使用正确的函数替换匿名函数。