0

私の問題は、この例のように文字列内srcのタグの値を置き換える方法です<script>(タグ内のプロパティのより一般的なシナリオでこれが必要です):

$data = <<<EOD
<script language="javascript" src= "../tests/ajax-navigation.js"></script>
...
<script language="javascript" type="text/javascript">
...
<img src="../404.jpg" alt="404">
...
EOD;

preg_replace() ここに別の質問を投稿しましたが、これについて大きな議論があるためDOMDocument、php でこの関数を使用することにしました。

public static function replacePropertyDOM($html, $tag, $property, $alias){
   $dom = new \DOMDocument();
   @$dom->loadHTML($html);
   $dom->preserveWhiteSpace = true;
   $els = $dom->getElementsByTagName($tag);
   foreach($els as $el){
      if($el->hasAttribute($property)){
         $el->removeAttribute($property);
         $el->setAttribute($property, $alias);
      }
   }
   return $dom->saveHTML();
}

私はこのように呼んだ:

 $data = Search::replacePropertyDOM($data, "script", "src", $alias);

ただし、いくつか質問があります。

  • DOMDocumentコード内のすべての改行が保持されていないようです

  • $dom->loadHTML($html);なしで使用する@と、次のようなコード番号 2 の警告が表示されます。

    DOMDocument::loadHTML(): 予期しない終了タグ: エンティティ内のリンク、行: 9

<head>このようなリンクの場合

<link rel="stylesheet" type="text/css" href="../tests/ajax-navigation.css"></link>

さらに悪いことに

DOMDocument::loadHTML(): Unexpected end tag : b in Entity, line: 33

js コマンドの場合

mydebug.innerHTML = '<p><b>Test $$.ccl.ajax.getInstance()</b></p>';
  • そして最後の 1 つ: これらのタグを見つけて、データ内の文字列置換に進むのは良くないので、html 文字列を返すときにフォーマット エラーが発生しませんか?

わかりました、小さな変更を加えて私のソリューションに固執します

$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 

したがって、DOMDocument出力を適切にフォーマットし、期待するものをより再帰的にする方法を決定します!

4

0 に答える 0