php过滤html标记属性类用法实例


Posted in PHP onSeptember 23, 2014

本文实例讲述了php 过滤html标记属性类及其用法。是PHP项目开发中比较常见的实用技巧。分享给大家供大家参考。具体方法如下:

HtmlAttributeFilter.class.php类文件如下:

<?php 
/** HTML Attribute Filter 
*  Date:  2013-09-22 
*  Author: fdipzone 
*  ver:  1.0 
* 
*  Func: 
*  public strip       过滤属性 
*  public setAllow      设置允许的属性 
*  public setException    设置特例 
*  public setIgnore     设置忽略的标记 
*  private findElements    搜寻需要处理的元素 
*  private findAttributes   搜寻属性 
*  private removeAttributes  移除属性 
*  private isException    判断是否特例 
*  private createAttributes  创建属性 
*  private protect      特殊字符转义 
*/ 
 
class HtmlAttributeFilter{ // class start 
 
  private $_str = '';      // 源字符串 
  private $_allow = array();   // 允许保留的属性 例如:array('id','class','title') 
  private $_exception = array(); // 特例 例如:array('a'=>array('href','class'),'span'=>array('class')) 
  private $_ignore = array();  // 忽略过滤的标记 例如:array('span','img') 
 
 
  /** 处理HTML,过滤不保留的属性 
  * @param String $str 源字符串 
  * @return String 
  */ 
  public function strip($str){ 
    $this->_str = $str; 
 
    if(is_string($this->_str) && strlen($this->_str)>0){ // 判断字符串 
 
      $this->_str = strtolower($this->_str); // 转成小写 
 
      $res = $this->findElements(); 
      if(is_string($res)){ 
        return $res; 
      } 
      $nodes = $this->findAttributes($res); 
      $this->removeAttributes($nodes); 
    } 
    return $this->_str; 
  } 
 
  /** 设置允许的属性 
  * @param Array $param 
  */ 
  public function setAllow($param=array()){ 
    $this->_allow = $param; 
  } 
 
  /** 设置特例 
  * @param Array $param 
  */ 
  public function setException($param=array()){ 
    $this->_exception = $param; 
  } 
 
  /** 设置忽略的标记 
  * @param Array $param 
  */ 
  public function setIgnore($param=array()){ 
    $this->_ignore = $param; 
  } 
 
  /** 搜寻需要处理的元素 */ 
  private function findElements(){ 
    $nodes = array(); 
    preg_match_all("/<([^ !\/\>\n]+)([^>]*)>/i", $this->_str, $elements); 
    foreach($elements[1] as $el_key => $element){ 
      if($elements[2][$el_key]){ 
        $literal = $elements[0][$el_key]; 
        $element_name = $elements[1][$el_key]; 
        $attributes = $elements[2][$el_key]; 
        if(is_array($this->_ignore) && !in_array($element_name, $this->_ignore)){ 
          $nodes[] = array('literal'=>$literal, 'name'=>$element_name, 'attributes'=>$attributes); 
        } 
      } 
    } 
 
    if(!$nodes[0]){ 
      return $this->_str; 
    }else{ 
      return $nodes; 
    } 
  } 
 
  /** 搜寻属性 
  * @param Array $nodes 需要处理的元素 
  */ 
  private function findAttributes($nodes){ 
    foreach($nodes as &$node){ 
      preg_match_all("/([^ =]+)\s*=\s*[\"|']{0,1}([^\"']*)[\"|']{0,1}/i", $node['attributes'], $attributes); 
      if($attributes[1]){ 
        foreach($attributes[1] as $att_key=>$att){ 
          $literal = $attributes[0][$att_key]; 
          $attribute_name = $attributes[1][$att_key]; 
          $value = $attributes[2][$att_key]; 
          $atts[] = array('literal'=>$literal, 'name'=>$attribute_name, 'value'=>$value); 
        } 
      }else{ 
        $node['attributes'] = null; 
      } 
      $node['attributes'] = $atts; 
      unset($atts); 
    } 
    return $nodes; 
  } 
 
  /** 移除属性 
  * @param Array $nodes 需要处理的元素 
  */ 
  private function removeAttributes($nodes){ 
    foreach($nodes as $node){ 
      $node_name = $node['name']; 
      $new_attributes = ''; 
      if(is_array($node['attributes'])){ 
        foreach($node['attributes'] as $attribute){ 
          if((is_array($this->_allow) && in_array($attribute['name'], $this->_allow)) || $this->isException($node_name, $attribute['name'], $this->_exception)){ 
            $new_attributes = $this->createAttributes($new_attributes, $attribute['name'], $attribute['value']); 
          } 
        } 
      } 
      $replacement = ($new_attributes) ? "<$node_name $new_attributes>" : "<$node_name>"; 
      $this->_str = preg_replace('/'.$this->protect($node['literal']).'/', $replacement, $this->_str); 
    } 
  } 
 
  /** 判断是否特例 
  * @param String $element_name  元素名 
  * @param String $attribute_name 属性名 
  * @param Array $exceptions   允许的特例 
  * @return boolean 
  */ 
  private function isException($element_name, $attribute_name, $exceptions){ 
    if(array_key_exists($element_name, $this->_exception)){ 
      if(in_array($attribute_name, $this->_exception[$element_name])){ 
        return true; 
      } 
    } 
    return false; 
  } 
 
  /** 创建属性 
  * @param String $new_attributes 
  * @param String $name 
  * @param String $value 
  * @return String 
  */ 
  private function createAttributes($new_attributes, $name, $value){ 
    if($new_attributes){ 
      $new_attributes .= " "; 
    } 
    $new_attributes .= "$name=\"$value\""; 
    return $new_attributes; 
  } 
 
 
  /** 特殊字符转义 
  * @param String $str 源字符串 
  * @return String 
  */ 
  private function protect($str){ 
    $conversions = array( 
      "^" => "\^",  
      "[" => "\[",  
      "." => "\.",  
      "$" => "\$",  
      "{" => "\{",  
      "*" => "\*",  
      "(" => "\(",  
      "\\" => "\\\\",  
      "/" => "\/",  
      "+" => "\+",  
      ")" => "\)",  
      "|" => "\|",  
      "?" => "\?",  
      "<" => "\<",  
      ">" => "\>"  
    ); 
    return strtr($str, $conversions); 
  } 
 
} // class end 
 
?>

demo示例代码如下:

<?php 
require('HtmlAttributeFilter.class.php'); 
 
$str = '<div class="bd clearfix" id="index_hilite_ul"><ul class="list"><li><img src="http://su.bdimg.com/static/skin/img/logo_white.png" width="118" height="148"><div class="cover"><a class="text" href="https://3water.com"><strong>yuna</strong><p>love</p></a><strong class="t g">want to know</strong><a href="/login.html" class="ppBtn"><strong class="text">YES</strong></a></div></li></ul></div>'; 
 
$obj = new HtmlAttributeFilter(); 
 
// 允许id属性 
$obj->setAllow(array('id')); 
 
$obj->setException(array( 
  'a' => array('href'),  // a 标签允许有 href属性特例 
  'ul' => array('class') // ul 标签允许有 class属性特例 
)); 
 
// img 标签忽略,不过滤任何属性 
$obj->setIgnore(array('img')); 
 
echo 'source str:<br>'; 
echo htmlspecialchars($str).'<br><br>'; 
echo 'filter str:<br>'; 
echo htmlspecialchars($obj->strip($str)); 
?>

本文完整源码点击此处本机下载。

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
2.PHP入门
Oct 09 PHP
五个PHP程序员工具
May 26 PHP
php 结果集的分页实现代码
Mar 10 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
关于crontab的使用详解
Jun 24 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
PHP加MySQL消息队列深入理解
Feb 27 PHP
php广告加载类用法实例
Sep 23 #PHP
php实现根据url自动生成缩略图的方法
Sep 23 #PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 #PHP
PHP图片库imagemagick安装方法
Sep 23 #PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 #PHP
php实现的支持断点续传的文件下载类
Sep 23 #PHP
php实现的click captcha点击验证码类实例
Sep 23 #PHP
You might like
php自动跳转中英文页面
2008/07/29 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
js获取location.href的参数实例代码
2013/08/02 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Django在win10下的安装并创建工程
2017/11/20 Python
简单介绍python封装的基本知识
2019/08/10 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
HTML5进度条特效
2014/12/18 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
承诺函格式模板
2015/01/21 职场文书
建党伟业电影观后感
2015/06/01 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题