質問する
283 次
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 に答える