0

我想检查正文下的所有标签并检查并删除它是否具有我尝试过的样式属性

$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')) {
.
.
.

或任何其他解决方案???

需要另外一项建议。如果我只从<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

您可以使用 XPath 仅获取具有style属性的元素

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

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