2011-03-29 179 views
1

Tricky preg_replace_callback函数在这里 - 我承认在PRCE表达式上不是很好。使用preg_replace_callback()从HTML字符串中提取所有图像

我想从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'

可以在做什么?

谢谢

+0

[正则表达式来更改所有img src属性的格式]的可能重复(http://stackoverflow.com/questions/3131691/regex-to-change-format-of-all-img-src-attributes) – Gordon 2011-03-29 15:34:52

回答

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

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

$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工作,除非你有一个适当替换匿名函数。

相关问题