php過濾html標記屬性類用法實例
更新時間:2014年09月23日 14:42:29 投稿:shichen2014
這篇文章主要介紹了php過濾html標記屬性類及其用法,包括對HTML標記元素的過濾、移除、轉(zhuǎn)義等等操作,非常實用,需要的朋友可以參考下
本文實例講述了php 過濾html標記屬性類及其用法。是PHP項目開發(fā)中比較常見的實用技巧。分享給大家供大家參考。具體方法如下:
HtmlAttributeFilter.class.php類文件如下:
<?php
/** HTML Attribute Filter
* Date: 2013-09-22
* Author: fdipzone
* ver: 1.0
*
* Func:
* public strip 過濾屬性
* public setAllow 設(shè)置允許的屬性
* public setException 設(shè)置特例
* public setIgnore 設(shè)置忽略的標記
* private findElements 搜尋需要處理的元素
* private findAttributes 搜尋屬性
* private removeAttributes 移除屬性
* private isException 判斷是否特例
* private createAttributes 創(chuàng)建屬性
* private protect 特殊字符轉(zhuǎn)義
*/
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); // 轉(zhuǎn)成小寫
$res = $this->findElements();
if(is_string($res)){
return $res;
}
$nodes = $this->findAttributes($res);
$this->removeAttributes($nodes);
}
return $this->_str;
}
/** 設(shè)置允許的屬性
* @param Array $param
*/
public function setAllow($param=array()){
$this->_allow = $param;
}
/** 設(shè)置特例
* @param Array $param
*/
public function setException($param=array()){
$this->_exception = $param;
}
/** 設(shè)置忽略的標記
* @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;
}
/** 創(chuàng)建屬性
* @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;
}
/** 特殊字符轉(zhuǎn)義
* @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="http://www.dhdzp.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程序設(shè)計有所幫助。
您可能感興趣的文章:
- PHP中類屬性與類靜態(tài)變量的訪問方法示例
- PHP取得一個類的屬性和方法的實現(xiàn)代碼
- php類中private屬性繼承問題分析
- PHP獲取類中常量,屬性,及方法列表的方法
- php中類和對象:靜態(tài)屬性、靜態(tài)方法
- PHP動態(tài)地創(chuàng)建屬性和方法, 對象的復(fù)制, 對象的比較,加載指定的文件,自動加載類文件,命名空間
- php 類中的常量、靜態(tài)屬性、非靜態(tài)屬性的區(qū)別
- PHP用正則匹配form表單中所有元素的類型和屬性值實例代碼
- PHP的反射動態(tài)獲取類方法、屬性、參數(shù)操作示例
- php類常量用法實例分析
- php類常量的使用詳解
- PHP 面向?qū)ο蟪绦蛟O(shè)計之類屬性與類常量實現(xiàn)方法分析
相關(guān)文章
PHP操作Postgresql封裝類與應(yīng)用完整實例
這篇文章主要介紹了PHP操作Postgresql封裝類,結(jié)合實例形式分析了php針對Postgresql數(shù)據(jù)庫常見的連接、查詢、統(tǒng)計等操作封裝技巧與使用方法,需要的朋友可以參考下2018-04-04
PHP $O00OO0=urldecode & eval 解密,記一次商業(yè)源碼的去后門
最近看到如下的php代碼$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");等很長的代碼,這里給出破解方法,需要的朋友可以參考下2020-09-09
PHP實現(xiàn)圖的鄰接矩陣表示及幾種簡單遍歷算法分析
這篇文章主要介紹了PHP實現(xiàn)圖的鄰接矩陣表示及幾種簡單遍歷算法,結(jié)合實例形式分析了php基于鄰接矩陣實現(xiàn)圖的定義及相關(guān)遍歷操作技巧,需要的朋友可以參考下2017-11-11
php源碼分析之DZX1.5隨機數(shù)函數(shù)random用法
這篇文章主要介紹了php源碼分析之DZX1.5隨機數(shù)函數(shù)random用法,實例分析了DZX1.5中random函數(shù)生成隨機字符串的使用技巧,需要的朋友可以參考下2015-06-06

