私の問題は、この例のように文字列内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
出力を適切にフォーマットし、期待するものをより再帰的にする方法を決定します!