2

特定の要件を満たす HTML のすべての画像を適切なテキストに置き換えようとしています。特定の要件は、それらがクラス「replaceMe」であり、画像のソース ファイル名が $myArray にあることです。ソリューションを検索すると、ある種の PHP DOM 手法が適切であるように見えますが、私はこれに非常に慣れていません。たとえば、$html が与えられた場合、$desired_html を返したいとします。この投稿の最後に、現在機能していない実装を試みました。ありがとうございました

$myArray=array(
    'goodImgage1'=>'Replacement for Good Image 1',
    'goodImgage2'=>'Replacement for Good Image 2'
);

$html = '<div>
<p>Random text and an <img src="goodImgage1.png" alt="" class="replaceMe">.  More random text.</p>
<p>Random text and an <img src="goodImgage2.png" alt="" class="replaceMe">.  More random text.</p>
<p>Random text and an <img src="goodImgage2.png" alt="" class="dontReplaceMe">.  More random text.</p>
<p>Random text and an <img src="badImgage1.png"  alt="" class="replaceMe">.  More random text.</p>
</div>';

$desiredHtml = '<div>
<p>Random text and an Replacement for Good Image 1.  More random text.</p>
<p>Random text and an Replacement for Good Image 2.  More random text.</p>
<p>Random text and an <img src="goodImgage2.png" alt="" class="dontReplaceMe">.  More random text.</p>
<p>Random text and an <img src="badImgage1.png"  alt="" class="replaceMe">.  More random text.</p>
</div>';

以下は私がやろうとしていることです..

libxml_use_internal_errors(true);   //Temorarily disable errors resulting from improperly formed HTML
$doc = new DOMDocument();
$doc->loadHTML($html);

//What does this do for me?
$imgs= $doc->getElementsByTagName('img');
foreach ($imgs as $img){}

$xpath = new DOMXPath($doc);
foreach( $xpath->query( '//img') as $img) {
    if(true){   //How do I check class and image name?
        $new = $doc->createTextNode("New Attribute"); 
        $img->parentNode->replaceChild($new,$img);
    }
}

$html=$doc->saveHTML();
libxml_use_internal_errors(false);
4

2 に答える 2

1

このようにしてください、あなたは良い方法でした:

$myArray=array(
    'goodImgage1.png'=>'Replacement for Good Image 1',
    'goodImgage2.png'=>'Replacement for Good Image 2'
);

$html = '<div>
<p>Random text and an <img src="goodImgage1.png" alt="" class="replaceMe">.  More random text.</p>
<p>Random text and an <img src="goodImgage2.png" alt="" class="replaceMe">.  More random text.</p>
<p>Random text and an <img src="goodImgage2.png" alt="" class="dontReplaceMe">.  More random text.</p>
<p>Random text and an <img src="badImgage1.png"  alt="" class="replaceMe">.  More random text.</p>
</div>';

$classesToReplace = array('replaceMe');

libxml_use_internal_errors(true);   //Temorarily disable errors resulting from improperly formed HTML
$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DOMXPath($doc);
foreach( $xpath->query( '//img') as $img) {
    // get the classes into an array
    $classes = explode(' ', $img->getAttribute('class')); // this will contain the classes assigned to the element
    $classMatches = array_intersect($classes, $classesToReplace);

    // preprocess the image name to match the $myArray keys
    $imageName = $img->getAttribute('src');

    if (isset($myArray[$imageName]) && $classMatches) {   
        $new = $doc->createTextNode($myArray[$imageName]); 
        $img->parentNode->replaceChild($new,$img);
    }
}

echo var_dump($html = $doc->saveHTML());

次の点に注意してください:

  • replaceMe潜在的に他のクラスに加えて、クラスを持つ画像のコードチェックを行いました
  • $myArray基本的に簡単にするために、完全な画像ファイル名をキーに追加しました。
于 2013-05-19T19:42:10.530 に答える