2010-03-07 117 views
1

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

编辑:这里是他们如何做到在Kohana中:

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

编辑:这里是他们如何做到这一点的笨:

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

您不关心已经以编程方式添加的事件侦听器吗? – Robusto 2010-03-07 02:25:16

+0

在当前情况下不关心这一点。 – 2010-03-07 02:31:24

回答

2

该函数需要4个参数。

  1. $ msg。您要从中剥离属性的文本。
  2. $ tag。您想从中剥离属性的标签(例如,p)。
  3. $ attr。一个数组,其中包含要剥离的属性的名称(其余部分完好无损)。如果数组为空,则该函数将剥离所有属性。
  4. $后缀。附加到标签的可选文本。例如,它可能是一个新的属性。

Stripping Tag Attributes from HTML code两者在这里笔者职位代码,我从我的回答省略它,因为它是漫长的,不想要求代码的所有权。

希望这是你在找什么。

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片段转换为完整文档,但您可以将其用作起点。