-
-
/**HTML Attribute Filter
- * Date: 2013-09-22
- * Author: fdipzone
- * ver: 1.0
- * edit: bbs.it-home.org
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func:
- * Func: * public strip 過濾屬性
- * public setAllow 設定允許的屬性
- * public setException 設定特例
- * public setIgnore 設定忽略的標記
- * private findElements 搜尋需要處理的元素* 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 = $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 findAttrides) {
- 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 처리할 배열 $nodes 요소
- */
- 비공개 함수 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 allowed 특수 사례
- * @return boolean
- */
- 비공개 함수 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;
- }
- }
- false를 반환합니다.
- }
/**创建属性 - * @param String $new_attributes
- * @param String $name
- * @param String $value
- * @return String
- */
- 비공개 함수 createAttributes($new_attributes, $name, $value){
- if($new_attributes){
- $new_attributes .= " ";
- }
- $new_attributes .= "$name="$value"";
- $new_attributes를 반환합니다.
- }
-
- /**특수 문자 이스케이프
- * @param String $str 소스 문자열
- * @return String
- */
- 개인 함수 보호($str){
- $conversions = array(
- "^" => "^",
- "[" => "[",
- "." => ".",
- "$" => "$",
- "{ ",
- "*" => "*",
- "(" => "(",
- "\" => "\\",
- "/" => ; "/",
- " " => " ",
- ")" => ")",
- "|" => ; "?",
- "<",
- ">"
- return strtr($str, $conversions);
- }
-
- } // 수업 종료
-
- ?>
复代码
2, 시연 예시
-
- require('HtmlAttributeFilter.class.php')
-
- $str = ''; 🎜>
- $obj = new HtmlAttributeFilter();
-
- // ID 속성 허용
- $obj->setAllow(array('id')); ->setException(array(
- 'a' => array('href'), // a 태그는 href 속성의 특수한 경우를 허용합니다
- 'ul' => array('class') / / ul 태그는 클래스 속성의 특수한 경우를 허용합니다
- ));
-
- // img 태그는 무시되고 속성은 필터링되지 않습니다.
- $obj->setIgnore(array('img')) ;
-
- echo '소스 문자열:
'
- echo htmlspecialchars($str).'
'
- echo '필터 문자열:
echo htmlspecialchars($obj->strip($str));
- ?>
-
-
- 코드 복사
PHP 필터 html 태그 속성 클래스 소스코드 다운로드 주소
|