当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-14 11:38:21 浏览: 评论:0 

这篇文章主要介绍了php过滤html标记属性类及其用法,包括对HTML标记元素的过滤、移除、转义等等操作,非常实用,需要的朋友可以参考下

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

HtmlAttributeFilter.class.php类文件如下:

  1. <?php  
  2. /** HTML Attribute Filter  
  3. *  Date:  2013-09-22  
  4. *  Author: fdipzone  
  5. *  ver:  1.0  
  6.  
  7. *  Func:  
  8. *  public strip       过滤属性  
  9. *  public setAllow      设置允许的属性  
  10. *  public setException    设置特例  
  11. *  public setIgnore     设置忽略的标记  
  12. *  private findElements    搜寻需要处理的元素  
  13. *  private findAttributes   搜寻属性  
  14. *  private removeAttributes  移除属性  
  15. *  private isException    判断是否特例  
  16. *  private createAttributes  创建属性  
  17. *  private protect      特殊字符转义  
  18. */ 
  19.    
  20. class HtmlAttributeFilter{ // class start  
  21.    
  22.   private $_str = '';      // 源字符串  
  23.   private $_allow = array();   // 允许保留的属性 例如:array('id','class','title')  
  24.   private $_exception = array(); // 特例 例如:array('a'=>array('href','class'),'span'=>array('class'))  
  25.   private $_ignore = array();  // 忽略过滤的标记 例如:array('span','img')  
  26.    
  27.    
  28.   /** 处理HTML,过滤不保留的属性  
  29.   * @param String $str 源字符串  
  30.   * @return String  
  31.   */ 
  32.   public function strip($str){  
  33.     $this->_str = $str;  
  34.    
  35.     if(is_string($this->_str) && strlen($this->_str)>0){ // 判断字符串  
  36.    
  37.       $this->_str = strtolower($this->_str); // 转成小写  
  38.    
  39.       $res = $this->findElements();  
  40.       if(is_string($res)){  
  41.         return $res;  
  42.       }  
  43.       $nodes = $this->findAttributes($res);  
  44.       $this->removeAttributes($nodes);  
  45.     }  
  46.     return $this->_str;  
  47.   }  
  48.    
  49.   /** 设置允许的属性  
  50.   * @param Array $param  
  51.   */ 
  52.   public function setAllow($param=array()){  
  53.     $this->_allow = $param;  
  54.   }  
  55.    
  56.   /** 设置特例  
  57.   * @param Array $param  
  58.   */ 
  59.   public function setException($param=array()){  
  60.     $this->_exception = $param;  
  61.   }  
  62.    
  63.   /** 设置忽略的标记  
  64.   * @param Array $param  
  65.   */ 
  66.   public function setIgnore($param=array()){  
  67.     $this->_ignore = $param;  
  68.   }  
  69.    
  70.   /** 搜寻需要处理的元素 */ 
  71.   private function findElements(){  
  72.     $nodes = array();  
  73.     preg_match_all("/<([^ !\/\>\n]+)([^>]*)>/i"$this->_str, $elements);  
  74.     foreach($elements[1] as $el_key => $element){  
  75.       if($elements[2][$el_key]){  
  76.         $literal = $elements[0][$el_key];  
  77.         $element_name = $elements[1][$el_key];  
  78.         $attributes = $elements[2][$el_key];  
  79.         if(is_array($this->_ignore) && !in_array($element_name$this->_ignore)){  
  80.           $nodes[] = array('literal'=>$literal'name'=>$element_name'attributes'=>$attributes);  
  81.         }  
  82.       }  
  83.     }  
  84.    
  85.     if(!$nodes[0]){  
  86.       return $this->_str;  
  87.     }else{  
  88.       return $nodes;  
  89.     }  
  90.   }  
  91.    
  92.   /** 搜寻属性  
  93.   * @param Array $nodes 需要处理的元素  
  94.   */ 
  95.   private function findAttributes($nodes){  
  96.     foreach($nodes as &$node){  
  97.       preg_match_all("/([^ =]+)\s*=\s*[\"|']{0,1}([^\"']*)[\"|']{0,1}/i"$node['attributes'], $attributes);  
  98.       if($attributes[1]){  
  99.         foreach($attributes[1] as $att_key=>$att){  
  100.           $literal = $attributes[0][$att_key];  
  101.           $attribute_name = $attributes[1][$att_key];  
  102.           $value = $attributes[2][$att_key];  
  103.           $atts[] = array('literal'=>$literal'name'=>$attribute_name'value'=>$value);  
  104.         }  
  105.       }else{  
  106.         $node['attributes'] = null;  
  107.       }  
  108.       $node['attributes'] = $atts;  
  109.       unset($atts);  
  110.     }  
  111.     return $nodes;  
  112.   }  
  113.    
  114.   /** 移除属性  
  115.   * @param Array $nodes 需要处理的元素  
  116.   */ 
  117.   private function removeAttributes($nodes){  
  118.     foreach($nodes as $node){  
  119.       $node_name = $node['name'];  
  120.       $new_attributes = '';  
  121.       if(is_array($node['attributes'])){  
  122.         foreach($node['attributes'as $attribute){  
  123.           if((is_array($this->_allow) && in_array($attribute['name'], $this->_allow)) || $this->isException($node_name$attribute['name'], $this->_exception)){  
  124.             $new_attributes = $this->createAttributes($new_attributes$attribute['name'], $attribute['value']);  
  125.           }  
  126.         }  
  127.       }  
  128.       $replacement = ($new_attributes) ? "<$node_name $new_attributes>" : "<$node_name>";  
  129.       $this->_str = preg_replace('/'.$this->protect($node['literal']).'/'$replacement$this->_str);  
  130.     }  
  131.   }  
  132.    
  133.   /** 判断是否特例  
  134.   * @param String $element_name  元素名  
  135.   * @param String $attribute_name 属性名  
  136.   * @param Array $exceptions   允许的特例  
  137.   * @return boolean  
  138.   */ 
  139.   private function isException($element_name$attribute_name$exceptions){  
  140.     if(array_key_exists($element_name$this->_exception)){  
  141.       if(in_array($attribute_name$this->_exception[$element_name])){  
  142.         return true;  
  143.       }  
  144.     }  
  145.     return false;  
  146.   }  
  147.    
  148.   /** 创建属性  
  149.   * @param String $new_attributes  
  150.   * @param String $name  
  151.   * @param String $value  
  152.   * @return String  
  153.   */ 
  154.   private function createAttributes($new_attributes$name$value){  
  155.     if($new_attributes){  
  156.       $new_attributes .= " ";  
  157.     }  
  158.     $new_attributes .= "$name=\"$value\"";  
  159.     return $new_attributes;  
  160.   }  
  161.    
  162.    
  163.   /** 特殊字符转义  
  164.   * @param String $str 源字符串  
  165.   * @return String  
  166.   */ 
  167.   private function protect($str){  
  168.     $conversions = array(  
  169.       "^" => "\^",   
  170.       "[" => "\[",   
  171.       "." => "\.",   
  172.       "$" => "\$",   
  173.       "{" => "\{",   
  174.       "*" => "\*",   
  175.       "(" => "\(",   
  176.       "\\" => "\\\\",   
  177.       "/" => "\/",   
  178.       "+" => "\+",   
  179.       ")" => "\)",   
  180.       "|" => "\|",   
  181.       "?" => "\?",   
  182.       "<" => "\<",   
  183.       ">" => "\>"  
  184.     );  
  185.     return strtr($str$conversions);  
  186.   } //www.phpfensi.com 
  187.    
  188. // class end  
  189.    
  190. ?> 

demo示例代码如下:

  1. <?php  
  2. require('HtmlAttributeFilter.class.php');  
  3.    
  4. $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://www.jb51.net"><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>';  
  5.    
  6. $obj = new HtmlAttributeFilter();  
  7.    
  8. // 允许id属性  
  9. $obj->setAllow(array('id'));  
  10.    
  11. $obj->setException(array(  
  12.   'a' => array('href'),  // a 标签允许有 href属性特例  
  13.   'ul' => array('class'// ul 标签允许有 class属性特例  
  14. ));  
  15.    
  16. // img 标签忽略,不过滤任何属性  
  17. $obj->setIgnore(array('img'));  
  18.    
  19. echo 'source str:<br>';  
  20. echo htmlspecialchars($str).'<br><br>';  
  21. echo 'filter str:<br>';  
  22. echo htmlspecialchars($obj->strip($str));  
  23. ?>  

Tags: php过滤html

分享到: