PHP使用Simple_HTML_DOM遍历、过滤及保留指定属性

简介:

复制代码
<?
/*
 * 参考资料:
 * http://www.phpddt.com/manual/simplehtmldom_1_5/manual_api.htm
 * http://www.phpddt.com/manual/simplehtmldom_1_5/manual.htm
 */

class HtmlUtil{
    
    /*
     * $allow:只允许这些属性存在
     * $exceptions:一些特殊的元素,可以存在某些属性
     */
    public function clear_child_html_attribute( $html_dom, $allow = array(), $exceptions = array() )
    {
        foreach( $html_dom->find('*') as $html_child_dom ) 
        {
            $this->clear_child_html_attribute( $html_child_dom, $allow, $exceptions );
            $this->clear_attribute( $html_child_dom, $allow, $exceptions );
        }
    }
    
    public function clear_attribute( $html_dom, $allow = array(), $exceptions = array() )
    {
        //遍历属性
        $attrs = $html_dom->getAllAttributes();
        
        if( count( $attrs ) > 0 )
        {
            //遍历属性,进行处理
            foreach( $attrs as $attr_key => $attr_value )
            {
                //如果是例外的,则不管
                $exceptions_attrs = $exceptions[ $html_dom->tag ];
                if( is_array( $exceptions_attrs ) && in_array( $attr_key , $exceptions_attrs ) ){ continue; }
                
                //如果不再允许列表中,则删除
                if( is_array( $allow ) && in_array( $attr_key , $allow ) ){ continue; }
                
                $html_dom->removeAttribute( $attr_key );
            }
        }
    }

    public function clear_html_attribute( $html_str, $allow = array(), $exceptions= array() )
    {
        include TEMPLATEPATH . '/class/simple_html_dom.php';
        
        $html = str_get_html( $html_str );
        
        foreach( $html->find( "*" ) as $html_dom )
        {
            //处理所有节点的属性
            $this->clear_child_html_attribute( $html_dom, $allow, $exceptions );
        }
        
        return $html;
    }
    
    function clear_html_post( $post_id )
    {
        if ( ! wp_is_post_revision( $post_id ) ){
            
            remove_action('save_post', array( $this, 'clear_html_post') );
            
            $my_post = get_post( $post_id );
            $my_post->post_content = $this->clear_html( $my_post->post_content );
            
            wp_update_post( $my_post );
            
            add_action('save_post', array( $this, 'clear_html_post') );
        }
    }
}
?>
复制代码

使用方法:

复制代码
<?
$html = "<p><a href='http://hcsem.com' style='color:#F00;' class='ttt'>黄聪的笔记本</a>还是<b class='test'>很不错</b>的哦!</p>";

$allow = array(
    'style',
    'colspan',
    'rowspan',
);

$exceptions = array(  
    'img' => array( 'src', 'alt' , 'title' , 'width' , 'height' , 'class', 'id' ),
    'a' => array( 'href', 'title', 'target'),
    'iframe'=>array('src','frameborder'),  
);

global $HtmlUtil;
$HtmlUtil = new HtmlUtil;
$html = $HtmlUtil->clear_html_attribute( $html, $allow, $exceptions );

//输出<p><a href='http://hcsem.com' style='color:#F00;'>黄聪的笔记本</a>还是<b>很不错</b>的哦!</p>
复制代码



本文转自黄聪博客园博客,原文链接:http://www.cnblogs.com/huangcong/p/5076522.html,如需转载请自行联系原作者
相关文章
|
2月前
|
移动开发 HTML5
HTML5 表单属性3
`&lt;input&gt;` 标签的 `formaction`、`formenctype` 和 `formmethod` 属性分别用于指定表单提交的 URL 地址、数据编码类型和提交方法,这些属性可覆盖 `&lt;form&gt;` 标签中的相应属性,并且主要适用于 `type=&quot;submit&quot;` 和 `type=&quot;image&quot;` 的输入类型。
|
1月前
|
移动开发 JavaScript 前端开发
HTML5 表单属性7
`pattern` 属性使用正则表达式验证 `&lt;input&gt;` 元素的值,适用于 `text`, `search`, `url`, `tel`, `email`, 和 `password` 类型。
|
1月前
|
移动开发 UED HTML5
HTML5 表单属性6
`min`、`max` 和 `step` 属性用于限制 `&lt;input&gt;` 标签中的数值或日期范围。例如,可以设置日期选择器的最早和最晚日期,或限制数字输入框的值范围。`multiple` 属性允许在 `&lt;input&gt;` 中选择多个值,适用于邮箱和文件类型。这些属性增强了表单控件的功能性和用户体验。
|
1月前
|
移动开发 HTML5
HTML5 表单属性5
`height` 和 `width` 属性用于 `&lt;input&gt;` 标签中的 `image` 类型,定义图像的高度和宽度。
|
2月前
|
移动开发 HTML5
HTML5 表单属性4
`formnovalidate` 属性是一个布尔属性,用于 `&lt;input&gt;` 元素,指示该输入在表单提交时不需验证,可覆盖 `&lt;form&gt;` 元素的 `novalidate` 属性,常与 `type=&quot;submit&quot;` 一起使用。示例中展示了如何通过两个提交按钮(一个使用验证,另一个不使用)实现不同的表单提交方式。
|
2月前
|
移动开发 JavaScript 前端开发
HTML5 表单属性2
`novalidate` 是 HTML `&lt;form&gt;` 元素的布尔属性,用于禁用浏览器的默认表单验证功能。当此属性存在时,浏览器不会检查表单字段是否符合预设的验证规则,允许开发者通过 JavaScript 等手段自定义验证逻辑。
|
1月前
|
移动开发 数据安全/隐私保护 HTML5
HTML5 表单属性8
`required`属性确保表单提交前输入框不能为空,适用于多种类型的 `&lt;input&gt;` 标签,如文本、邮箱、密码等。`step`属性则用于指定输入域中合法数值的间隔,常与`max`和`min`属性配合使用,适用于数字、日期等类型。例如,设置`&lt;input type=&quot;number&quot; step=&quot;3&quot;&gt;`可使输入值以3为单位递增或递减。
|
2月前
|
移动开发 UED HTML5
HTML5 表单属性1
HTML5为&lt;form&gt;和&lt;input&gt;标签引入了多个新属性,增强了表单的功能性和用户体验。其中,&lt;form&gt;新增了autocomplete和novalidate属性;&lt;input&gt;则增加了如autofocus、formaction、placeholder等13个新属性,支持更精细的表单控制和数据验证。例如,autocomplete属性允许表单或输入字段提供自动完成功能,提高用户填写效率。
|
2月前
|
搜索推荐 前端开发 UED
哪些 HTML 全局属性在 SEO 优化中比较重要?
【10月更文挑战第27天】这些HTML全局属性通过不同的方式为搜索引擎提供了更丰富、准确的页面信息,有助于提高页面的可索引性、相关性和用户体验,从而在SEO优化中发挥着重要的作用。开发者应充分重视并合理运用这些属性,以提升网站在搜索引擎中的排名和流量。
|
2月前
|
前端开发 搜索推荐 算法