0

body の下のすべてのタグを確認し、スタイル属性があるかどうかを確認して削除したい

$user_submitted_html = "This is Some Text";
$html = '<body>' . $user_submitted_html . '</body>';

$dom = new DOMDocument();
$dom->loadHTML($html_string);
$elements = $dom->getElementsByTagName('body');
foreach($elements as $element) {

   foreach($element->childNodes as $child) {

      if($child->hasAttribute('style')) {

          $child->removeAttribute('style')

      }      
   }  
 }

テキストだけでなく、タグが含まれていれば問題なく動作$user_submitted_htmlしますが、テキストだけの場合はエラーが発生します

Call to undefined method DOMText::hasAttribute()

次に、foreach ループで nodeName を取得します

echo "Node Name: " . $child->nodeName

それは

Node Name = #text

これはどのようなノード名ですか。私は他のノードをエコーし​​ました。それは、私がよく知っている div、span などを与えます。hasAttribute が属していない要素を知りたいので、このように hasAttribute を使用する前に条件を設定できます

if($child->nodeName=="#text") {
    continue; // skip to next iteration
}
if($child->hasAttribute('style')) {
.
.
.

またはその他の解決策???

もう 1 つの提案が必要です。からスタイル属性のみを削除するとどうなりますか<div>,<span>,<p> and <a>。残りのタグがスタイル属性を使用できる場合、xss から安全でしょうか。

4

2 に答える 2

1

nodeName をチェックする代わりに、クラス $child がインスタンスであることをチェックする方が良いと思います。

if ( $child instanceof DOMElement )
{
    //do your stuff
}
于 2013-03-29T12:28:18.893 に答える
0

style属性を持つ要素のみを取得するためにXPathを使用できます

$xpath = new DOMXPath($dom);
$elements = $xpath->query('//[@style]');

foreach($elements as $e) {
    $e->removeAttribute('style')
}  
于 2013-03-29T12:36:11.853 に答える