从标记中删除事件属性

时间:2010-03-07 02:05:00

标签: php html regex

我需要一个干净简单的脚本,可以从字符串中的所有html标签中查找和删除所有事件属性。 “on ...”属性是 - onclick,onkeyup等。

编辑:以下是他们在Kohana中的表现:

$string = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $string);

编辑:以下是他们在CodeIgniter中的表现:

$string = preg_replace("#<([^><]+?)([^a-z_\-]on\w*|xmlns)(\s*=\s*[^><]*)([><]*)#i", "<\\1\\4", $string);

2 个答案:

答案 0 :(得分:2)

  

该功能需要4个参数。

     
      
  1. $味精。要从中删除属性的文本。
  2.   
  3. $标签。要从(例如)p中删除属性的标记。
  4.   
  5. $ ATTR。一个数组,其中包含要删除的属性的名称(其余部分保持不变)。如果数组为空,则该函数将删除所有属性。
  6.   
  7. $后缀。附加到标记的可选文本。例如,它可能是一个新属性。
  8.   

从作者发布代码的Stripping Tag Attributes from HTML code开始,我从答案中省略了它,因为它很长并且不想声明代码的所有权。

希望这就是你要找的东西。

答案 1 :(得分:1)

你可以在这一行上做点什么:

<?php

$html = '<p class="foo" onclick="bar()">
    Lorem ipsum dolor sit amet, consectetur <em>adipisicing elit</em>,
    sed do eiusmod tempor incididunt ut labore
    <a href="http://www.google.es" onmouseover="mover()" onmouseout="mout()" title="Google">et dolore magna aliqua</a>.
    t enim ad minim veniam.</p>
';

$doc = new DOMDocument;
$doc->loadHTML($html);

echo "Before:\n" . $doc->saveHTML() . "\n";

foreach($doc->getElementsByTagName('*') as $node){
    $remove = array();
    foreach($node->attributes as $attributeName => $attribute){
        if( substr($attributeName, 0, 2)=='on' ){
            $remove[] = $attributeName;
        }
    }
    foreach($remove as $i){
        $node->removeAttribute($i);
    }
}

echo "After:\n" . $doc->saveHTML() . "\n";

?>

这只是一个想法。它需要一些调整,因为它添加了标签来转换完整文档中的HTML片段,但您可以将其用作起点。