这里有棘手的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'
能做到吗?
由于
答案 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版本,除非您使用正确的函数替换匿名函数。