ホームページ  >  記事  >  バックエンド開発  >  フィルタリングを設定し、属性を保持するために PHP で作成されたクラス

フィルタリングを設定し、属性を保持するために PHP で作成されたクラス

WBOY
WBOYオリジナル
2016-07-25 09:04:191000ブラウズ
  1. /**
  2. @ 属性を設定・保持するクラス
  3. @ class cleanHtml
  4. @ link: bbs.it-home.org
  5. @ date: 2013/2/28
  6. */
  7. function reg_escape( $str )
  8. {
  9. $conversions = array( "^" => "^", "[" => " ["、"." => "."、"$" => "$"、"{" => "{"、"*" => "*"、"(" => " (", "\" => "\\"、"/" => "/"、"+" => "+"、")" => ")"、"|" => 「|」、「?」、「<」、「>」
  10. return strtr( $str, $conversions );
  11. }
  12. /**
  13. * 属性クラスを削除します
  14. * XML 要素から属性を削除します
  15. * @author David (semlabs.co.uk)
  16. * @version 0.2.1
  17. */
  18. class cleanHtml{
  19. public $str = '';
  20. public $allow = array();
  21. public $Exceptions = array();
  22. public $ignore = array();
  23. パブリック関数ストリップ( $str )
  24. {
  25. $this->str = $str;
  26. if( is_string( $str ) && strlen( $str ) > 0 )
  27. {
  28. $res = $this->findElements();
  29. if( is_string( $res ) )
  30. return $res;
  31. $nodes = $this->findAttributes( $res );
  32. $this->removeAttributes( $nodes );
  33. }
  34. return $this->str;
  35. }
  36. private function findElements()
  37. {
  38. # 属性を持つ要素の配列を作成します
  39. $nodes = array();
  40. preg_match_all( "/<([^ !/>n]+)([^>]*)>/i", $this->str, $elements );
  41. foreach( $elements[1] as $el_key => $element )
  42. {
  43. if( $elements[2][$el_key] )
  44. {
  45. $literal = $elements[0][$el_key];
  46. $element_name = $elements[1][$el_key];
  47. $attributes = $elements[2][$el_key];
  48. if( is_array( $this->ignore ) && !in_array( $element_name, $this->ignore ) )
  49. $nodes[] = array( 'literal' => $literal, 'name' => $要素名, '属性' => $属性 );
  50. }
  51. }
  52. # 削除する属性がなかった場合は XML を返します
  53. if( !$nodes[0] )
  54. return $this->str;
  55. else
  56. $nodes を返します。
  57. }
  58. private function findAttributes( $nodes )
  59. {
  60. # 属性を抽出
  61. foreach( $nodes as &$node )
  62. {
  63. preg_match_all( "/([^ =]+)s*=s*["| ']{0,1}([^"']*)["|']{0,1}/i", $node['attributes'], $attributes );
  64. if( $attributes[1] )
  65. {
  66. foreach( $attributes[1] as $att_key => $att )
  67. {
  68. $literal = $attributes[0][$att_key]
  69. $attribute_name = $attributes[1][$att_key]; $value = $attributes[2][$att_key];
  70. $atts[] = array( 'literal' => $literal, 'name' => $attribute_name, 'value' => $value ); }
  71. }
  72. else
  73. $node['attributes'] = null;
  74. $node['attributes'] = $atts;
  75. unset( $atts );
  76. return $nodes;
  77. }
  78. private function RemoveAttributes( $nodes )
  79. {
  80. # 不要な属性を削除します
  81. foreach( $nodes as $node )
  82. {
  83. # ノードに保持する属性があるかどうかを確認します
  84. $node_name = $node['name' ];
  85. $new_attributes = '';
  86. if( is_array( $node['attributes'] ) )
  87. {
  88. foreach( $node['attributes'] as $attribute )
  89. {
  90. if( ( is_array( $this->allow ) && in_array( $attribute ['name'], $this->allow ) ) $this->isException( $node_name, $attribute['name'], $this->Exceptions ) )
  91. $new_attributes = $this-> ;createAttributes( $new_attributes, $attribute['name'], $attribute['value'] );
  92. }
  93. }
  94. $replacement = ( $new_attributes ) ? "<$node_name $new_attributes>" : "<$node_name>";
  95. $this->str = preg_replace( '/'.reg_escape( $node['literal'] ) .'/', $replacement, $this->str );
  96. }
  97. }
  98. プライベート関数 isException( $element_name, $attribute_name, $Exceptions )
  99. {
  100. if( array_key_exists($element_name, $this->例外) ) )
  101. {
  102. if( in_array( $attribute_name, $this- >例外[$element_name] ) )
  103. true を返します。
  104. }
  105. false を返します。
  106. }
  107. プライベート関数 createAttributes( $new_attributes, $name, $value )
  108. {
  109. if( $new_attributes )
  110. $new_attributes .= " ";
  111. $new_attributes .= "$name="$value"";
  112. $new_attributes を返します。
  113. }
  114. }
  115. ?>
复制代

调用实例:

  1. $str = 'これは のサンプル HTML です。 壊れています ';
  2. $sa = 新しい cleanHtml;
  3. $sa->allow = array( 'id' );
  4. $sa->Exceptions = array(
  5. 'img' => array( 'src', 'alt' ),
  6. 'a' => array( 'href', 'title' ),
  7. 'iframe '=>array('src','frameborder'),
  8. );
  9. echo $str = $sa->strip( $str );
  10. ?>
复制代


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。