0
4

3 回答 3

1

This is a quick work, so it may not look nice, but hopefully you get the idea.

Online demo

function walkDOM($node)
{
    if($node->nodeName=="pre" || $node->nodeName=="code")
    {
        return;
    }
    elseif($node->nodeName=="img")
    {
        $node->attributes->getNamedItem("src")->nodeValue=str_replace('desktop-img','mobile-img',$node->attributes->getNamedItem("src")->nodeValue);
    }
    elseif($node->hasChildNodes())
    {
        foreach($node->childNodes as $child)
        {
            walkDOM($child);
        }
    }
}
function changeImagePath($html)
{
    $dom=new DOMDocument;
    $dom->preserveWhiteSpace=true;
    $dom->loadHTML($html);
    $root=$dom->documentElement;
    walkDOM($root);
    $dom->formatOutput=false;
    return $dom->saveHTML($root);
}

The thought is to recursively walk through the DOM tree, skip every <pre> and <code>, and change all <img> that encountered.

This is pretty straight forward, but you may notice that since you treat it as HTML, DOM automatically add some tags to "fulfill" it, and format it in a (IMO) quite strange manner.

于 2013-08-14T11:18:29.617 回答
0

Xpath is your friend:

$xpath = new DOMXpath($dom);

foreach($xpath->query('//img[not(ancestor::pre) and not(ancestor::code)]') as $img){
  $img->setAttribute('src', 'foo');
}
于 2013-08-15T01:18:33.843 回答
0
$path1='C:/ff/ss.html';
$file=file_get_contents($path1);
$dom = new DOMDocument;
@$dom->loadHTML($file);
$links = $dom->getElementsByTagName('img');
//extract img src path from the html page 
foreach ($links as $link) { 
    $re= $link->getAttribute('src');
    $a[]=$re;
}
$oldpth=explode('/',$path1);
$c=count($oldpth)-1;
$fname=$oldpth[$c];
$pth=array_slice($oldpth,0,$c);
$cpth=implode('/',$pth);
foreach($a as $v) {
    if(is_file ($cpth.'/'.$v)) { 
        $c=explode('/',$v);
        $c[0]="xyz007";
        $f=implode('/',$c);
        $file=str_replace ($v,$f,$file);
    }
}
$path2='D:/mail/newpath/';
$wnew=fopen($path2.$fname,'w+');
fwrite($wnew,$file); 
于 2013-10-28T12:13:53.397 回答