0
4

3 に答える 3

1

簡単な作業なので見栄えが悪いかもしれませんが、ご理解いただければ幸いです。

オンラインデモ

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);
}

考えられるのは、DOM ツリーを再帰的にたどり、すべての<pre>andをスキップし、遭遇した<code>すべてを変更することです。<img>

これは非常に簡単ですが、HTML として扱うため、DOM が自動的にいくつかのタグを追加してそれを「満たす」ようにし、(IMO) 非常に奇妙な方法でフォーマットすることに気付くかもしれません。

于 2013-08-14T11:18:29.617 に答える
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 に答える
0

Xpath はあなたの友達です:

$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 に答える