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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php获取新浪微博数据API实例
Nov 12 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
php解析xml 的四种简单方法(附实例)
Jul 11 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
PHP中echo与print区别点整理
Mar 09 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
php中rename函数用法分析
2014/11/15 PHP
浅析php单例模式
2014/11/25 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
轮播的简单实现方法
2016/07/28 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
js实现全选和全不选
2020/07/28 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
python 字典中取值的两种方法小结
2018/08/02 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
艺术设计专业个人求职信范文
2013/12/11 职场文书
通信工程专业毕业生推荐信
2013/12/25 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
cf战队收人广告词
2014/03/14 职场文书
数字化校园建设方案
2014/05/03 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
总结几个非常实用的Python库
2021/06/26 Python