php过滤html标记属性类用法实例
本文实例讲述了php过滤html标记属性类及其用法。是PHP项目开发中比较常见的实用技巧。分享给大家供大家参考。具体方法如下:
HtmlAttributeFilter.class.php类文件如下:
<?php /**HTMLAttributeFilter *Date:2013-09-22 *Author:fdipzone *ver:1.0 * *Func: *publicstrip过滤属性 *publicsetAllow设置允许的属性 *publicsetException设置特例 *publicsetIgnore设置忽略的标记 *privatefindElements搜寻需要处理的元素 *privatefindAttributes搜寻属性 *privateremoveAttributes移除属性 *privateisException判断是否特例 *privatecreateAttributes创建属性 *privateprotect特殊字符转义 */ classHtmlAttributeFilter{//classstart 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,过滤不保留的属性 *@paramString$str源字符串 *@returnString */ publicfunctionstrip($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; } /**设置允许的属性 *@paramArray$param */ publicfunctionsetAllow($param=array()){ $this->_allow=$param; } /**设置特例 *@paramArray$param */ publicfunctionsetException($param=array()){ $this->_exception=$param; } /**设置忽略的标记 *@paramArray$param */ publicfunctionsetIgnore($param=array()){ $this->_ignore=$param; } /**搜寻需要处理的元素*/ privatefunctionfindElements(){ $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; } } /**搜寻属性 *@paramArray$nodes需要处理的元素 */ privatefunctionfindAttributes($nodes){ foreach($nodesas&$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; } /**移除属性 *@paramArray$nodes需要处理的元素 */ privatefunctionremoveAttributes($nodes){ foreach($nodesas$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); } } /**判断是否特例 *@paramString$element_name元素名 *@paramString$attribute_name属性名 *@paramArray$exceptions允许的特例 *@returnboolean */ privatefunctionisException($element_name,$attribute_name,$exceptions){ if(array_key_exists($element_name,$this->_exception)){ if(in_array($attribute_name,$this->_exception[$element_name])){ returntrue; } } returnfalse; } /**创建属性 *@paramString$new_attributes *@paramString$name *@paramString$value *@returnString */ privatefunctioncreateAttributes($new_attributes,$name,$value){ if($new_attributes){ $new_attributes.=""; } $new_attributes.="$name=\"$value\""; return$new_attributes; } /**特殊字符转义 *@paramString$str源字符串 *@returnString */ privatefunctionprotect($str){ $conversions=array( "^"=>"\^", "["=>"\[", "."=>"\.", "$"=>"\$", "{"=>"\{", "*"=>"\*", "("=>"\(", "\\"=>"\\\\", "/"=>"\/", "+"=>"\+", ")"=>"\)", "|"=>"\|", "?"=>"\?", "<"=>"\<", ">"=>"\>" ); returnstrtr($str,$conversions); } }//classend ?>
demo示例代码如下:
<?php require('HtmlAttributeFilter.class.php'); $str='<divclass="bdclearfix"id="index_hilite_ul"><ulclass="list"><li><imgsrc="http://su.bdimg.com/static/skin/img/logo_white.png"width="118"height="148"><divclass="cover"><aclass="text"href="https://www.nhooo.com"><strong>yuna</strong><p>love</p></a><strongclass="tg">wanttoknow</strong><ahref="/login.html"class="ppBtn"><strongclass="text">YES</strong></a></div></li></ul></div>'; $obj=newHtmlAttributeFilter(); //允许id属性 $obj->setAllow(array('id')); $obj->setException(array( 'a'=>array('href'),//a标签允许有href属性特例 'ul'=>array('class')//ul标签允许有class属性特例 )); //img标签忽略,不过滤任何属性 $obj->setIgnore(array('img')); echo'sourcestr:<br>'; echohtmlspecialchars($str).'<br><br>'; echo'filterstr:<br>'; echohtmlspecialchars($obj->strip($str)); ?>
本文完整源码点击此处本机下载。
希望本文所述对大家的PHP程序设计有所帮助。