Home  >  Article  >  Backend Development  >  PHP filter html tag attribute class usage example_PHP tutorial

PHP filter html tag attribute class usage example_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:18:22953browse

PHP filter html tag attribute class usage example

The specific method is as follows:

HtmlAttributeFilter.class.php class file is as follows:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

/** HTML Attribute Filter

* Date: 2013-09-22

* Author: fdipzone

* ver: 1.0

*

* Func:

* public strip filter attribute

* public setAllow Set allowed attributes

* public setException Set special case

* public setIgnore Set the ignored mark

* private findElements Search for elements that need to be processed

* private findAttributes Search attributes

* private removeAttributes Remove attributes

* private isException Determine whether it is a special case

* private createAttributes Create attributes

* private protect special character escaping

*/

class HtmlAttributeFilter{ // class start

private $_str = ''; // source string

private $_allow = array(); // Allowed retained attributes For example: array('id','class','title')

private $_exception = array(); // Special example: array('a'=>array('href','class'),'span'=>array('class'))

private $_ignore = array(); // Ignore filtered tags For example: array('span','img')

/**Process HTML, filter attributes that are not retained

* @param String $str source string

* @return String

*/

public function strip($str){

$this->_str = $str;

if(is_string($this->_str) && strlen($this->_str)>0){ // Determine the string

$this->_str = strtolower($this->_str); // Convert to lowercase

$res = $this->findElements();

if(is_string($res)){

return $res;

}

$nodes = $this->findAttributes($res);

$this->removeAttributes($nodes);

}

return $this->_str;

}

/**Set allowed attributes

* @param Array $param

*/

public function setAllow($param=array()){

$this->_allow = $param;

}

/**Set up special case

* @param Array $param

*/

public function setException($param=array()){

$this->_exception = $param;

}

/**Set ignored tags

* @param Array $param

*/

public function setIgnore($param=array()){

$this->_ignore = $param;

}

/**Search for elements to be processed*/

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; 

    } 

  } 

   

  /**Search properties

* @param Array $nodes elements to be processed

*/ 

  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; 

  } 

   

  /**Remove attribute

* @param Array $nodes elements to be processed

*/ 

  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); 

    } 

  } 

   

  /**Determine whether it is a special case

* @param String $element_name Element name

* @param String $attribute_name attribute name

* @param Array $exceptions Allowed 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; 

  } 

   

  /**创建属性 

  * @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; 

  } 

   

   

  /**Special character escaping

* @param String $str source string

* @return String

*/ 

  private function protect($str){ 

    $conversions = array( 

      "^" => "^",  

      "[" => "[",  

      "." => ".",  

      "$" => "$",  

      "{" => "{",  

      "*" => "*",  

      "(" => "(",  

      "\" => "\\",  

      "/" => "/",  

      "+" => "+",  

      ")" => ")",  

      "|" => "|",  

      "?" => "?",  

      "<" => "<",  

      ">" => ">"  

    ); 

    return strtr($str, $conversions); 

  } 

   

} // class end 

   

?>

demo示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

require('HtmlAttributeFilter.class.php');

$str = '

'; 

   

$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:
'; 

echo htmlspecialchars($str).'

'; 

echo 'filter str:
'; 

echo htmlspecialchars($obj->strip($str)); 

?>

1 2 3

4

6 7 8 9 10
11 12
13 14 15 16 17 18 19 20 21 22 23
<🎜>require('HtmlAttributeFilter.class.php'); <🎜> <🎜>   <🎜> <🎜>$str = '
';      $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:
';  echo htmlspecialchars($str).'

';  echo 'filter str:
';  echo htmlspecialchars($obj->strip($str));  ?>
http://www.bkjia.com/PHPjc/883507.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/883507.htmlTechArticlephp过滤html标记属性类用法实例 具体方法如下: HtmlAttributeFilter.class.php类文件如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn