>  기사  >  백엔드 개발  >  PHP 필터 html 태그 속성 클래스(소스 코드 첨부)

PHP 필터 html 태그 속성 클래스(소스 코드 첨부)

WBOY
WBOY원래의
2016-07-25 08:55:20930검색
  1. /**HTML Attribute Filter

  2. * Date: 2013-09-22
  3. * Author: fdipzone
  4. * ver: 1.0
  5. * edit: bbs.it-home.org
  6. * Func:
  7. * Func:
  8. * Func:
  9. * Func:
  10. * Func:
  11. * Func:
  12. * Func:
  13. * Func:
  14. * Func:
  15. * Func:
  16. * Func:
  17. * Func: * public strip 過濾屬性
  18. * public setAllow 設定允許的屬性
  19. * public setException 設定特例
  20. * public setIgnore 設定忽略的標記
  21. * private findElements 搜尋需要處理的元素* private removeAttributes 移除屬性
  22. * private isException 判斷是否特例
  23. * private createAttributes 建立屬性
  24. * private protect 特殊字元轉義
  25. */
  26. class HtmlAttributeFilter{ // class start
  27. private $_str = ''; // 來源字串
  28. private $_allow = array(); // 允許保留的屬性例如:array('id','class','title')
  29. private $_exception = array(); // 特例例如:array('a'=>array('href','class'),'span'=>array('class'))
  30. private $ _ignore = array(); // 忽略過濾的標記例如:array('span','img')
  31. /**處理HTML,過濾不保留的屬性
  32. * @param String $str 來源字串
  33. * @return String
  34. */
  35. public function strip($str){
  36. $this->_str = $str;
  37. if(is_string($this->_str) && strlen($this->_str)>0){ // 判斷字串
  38. $this->_str = strtolower($this->_str); // 轉成小寫
  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. * @param Array $param
  50. */
  51. public function setAllow($param=array()){
  52. $this->_allow = $this->_allow = $ param;
  53. }
  54. /**設定特例
  55. * @param Array $param
  56. */
  57. public function setException($param=array()){
  58. $this->_exception = $param
  59. ; }
  60. /**設定忽略的標記
  61. * @param Array $param
  62. */
  63. public function setIgnore($param=array()){
  64. $this->_ignore = $param;
  65. }
  66. /**搜尋需要處理的元素*/
  67. private function findElements(){
  68. $nodes = array();
  69. preg_match_all("/n] )([^> ]*)>/i", $this->_str, $elements);
  70. foreach($elements[1] as $el_key => $element){
  71. if($elements[2][$el_key ]){
  72. $literal = $elements[0][$el_key];
  73. $element_name = $elements[1][$el_key];
  74. $attributes = $elements[2][$el_key] ;
  75. if(is_array($this->_ignore) && !in_array($element_name, $this->_ignore)){
  76. $nodes[] = array('literal'=>$literal, 'name' =>$element_name, 'attributes'=>$attributes);
  77. }
  78. }
  79. }
  80. if(!$nodes[0]){
  81. return $this-> _str;
  82. }else{
  83. return $nodes;
  84. }
  85. }
  86. /**搜尋屬性
  87. * @param Array $nodes 需要處理的元素
  88. */ private function findAttrides) {
  89. foreach($nodes as &$node){
  90. preg_match_all("/([^ =] )s*=s*["|']{0,1}([^"']*) ["|']{0,1}/i", $node['attributes'], $attributes);
  91. if($attributes[1]){
  92. foreach($attributes[1] as $ att_key=>$att){
  93. $literal = $attributes[0][$att_key];
  94. $attribute_name = $attributes[1][$att_key];
  95. $value = $attributes[2] [$att_key];
  96. $atts[] = array('literal'=>$literal, 'name'=>$attribute_name, 'value'=>$value);
  97. } }else{ $node['attributes'] = null; } $node['attributes'] = $atts; unset($atts); } return $nodes ; }
  98. /**속성 제거
  99. * @param 처리할 배열 $nodes 요소
  100. */
  101. 비공개 함수 RemoveAttributes($nodes){
  102. foreach($nodes as $node){
  103. $node_name = $node['name'] ;
  104. $new_attributes = '';
  105. if(is_array($node['attributes'])){
  106. foreach($node['attributes'] as $attribute){
  107. if((is_array($this->_allow) && in_array($attribute['name'], $this->_allow)) || $this->isException($node_name, $attribute['name'], $this->_Exception)){
  108. $new_attributes = $this->createAttributes($new_attributes, $attribute['name'], $attribute['value']);
  109. }
  110. }
  111. }
  112. $replacement = ($new_attributes) ? "<$node_name $new_attributes>" : "<$node_name>";
  113. $this->_str = preg_replace('/'.$this->protect($node['literal']).'/', $replacement, $this->_str);
  114. }
  115. }
  116. /**특수 사례인지 확인
  117. * @param String $element_name 요소 이름
  118. * @param String $attribute_name 속성 이름
  119. * @param Array $Exceptions allowed 특수 사례
  120. * @return boolean
  121. */
  122. 비공개 함수 isException($element_name, $attribute_name, $Exceptions){
  123. if(array_key_exists($element_name, $ this->_Exception)){
  124. if(in_array($attribute_name, $this->_Exception[$element_name])){
  125. return true;
  126. }
  127. }
  128. false를 반환합니다.
  129. }

  130. /**创建属性

  131. * @param String $new_attributes
  132. * @param String $name
  133. * @param String $value
  134. * @return String
  135. */
  136. 비공개 함수 createAttributes($new_attributes, $name, $value){
  137. if($new_attributes){
  138. $new_attributes .= " ";
  139. }
  140. $new_attributes .= "$name="$value"";
  141. $new_attributes를 반환합니다.
  142. }
  143. /**특수 문자 이스케이프
  144. * @param String $str 소스 문자열
  145. * @return String
  146. */
  147. 개인 함수 보호($str){
  148. $conversions = array(
  149. "^" => "^",
  150. "[" => "[",
  151. "." => ".",
  152. "$" => "$",
  153. "{ ",
  154. "*" => "*",
  155. "(" => "(",
  156. "\" => "\\",
  157. "/" => ; "/",
  158. " " => " ",
  159. ")" => ")",
  160. "|" => ; "?",
  161. "<",
  162. ">"
  163. return strtr($str, $conversions);
  164. }
  165. } // 수업 종료
  166. ?>

复代码

2, 시연 예시

  1. require('HtmlAttributeFilter.class.php')
  2. $str = ''; 🎜>
  3. $obj = new HtmlAttributeFilter();
  4. // ID 속성 허용
  5. $obj->setAllow(array('id')); ->setException(array(
  6. 'a' => array('href'), // a 태그는 href 속성의 특수한 경우를 허용합니다
  7. 'ul' => array('class') / / ul 태그는 클래스 속성의 특수한 경우를 허용합니다
  8. ));
  9. // img 태그는 무시되고 속성은 필터링되지 않습니다.
  10. $obj->setIgnore(array('img')) ;
  11. echo '소스 문자열:
    '
  12. echo htmlspecialchars($str).'

    '
  13. echo '필터 문자열:echo htmlspecialchars($obj->strip($str));
  14. ?>
  15. 코드 복사
PHP 필터 html 태그 속성 클래스 소스코드 다운로드 주소

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.