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 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
async和DOM Script文件加载比较
Jul 20 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 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中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
php实现微信发红包功能
2018/07/13 PHP
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
为Python程序添加图形化界面的教程
2015/04/29 Python
python简单实现基数排序算法
2015/05/16 Python
python实现合并两个数组的方法
2015/05/16 Python
python函数局部变量用法实例分析
2015/08/04 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
大学军训感言
2014/01/10 职场文书
初三化学教学反思
2014/01/23 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
信访工作个人总结
2015/03/03 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python