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程序设计有所帮助。