-
-
/**HTML 属性フィルター - * 日付: 2013-09-22
- * 著者: fdipzone
- * バージョン: 1.0
- * 編集: bbs.it-home.org
- * 機能:
- * パブリック ストリップ フィルター属性
- * public setAllow 許可された属性を設定
- * public setException 特殊なケースを設定します
- * public setIgnore 無視されるマークを設定します
- * private findElements 処理が必要な要素を検索します
- * private findAttributes 属性を検索します
- * private RemoveAttributes 属性を削除します
- * private isException 特殊なケースかどうかを判断します
- * private createAttributes 属性を作成します
- * private protected 特殊文字エスケープ
- */
-
- class HtmlAttributeFilter{ // クラス開始
-
- 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 ストリップ($str){
- $this->_str = $str;
-
- if(is_string($this->_str) && strlen($this -> ;_str)>0){ // 文字列を決定します
-
- $this->_str = strto lower($this->_str) // 小文字に変換します
-
- $res = $this->findElements; () ;
- if(is_string($res)){
- $res; }
- $this->removeAttributes($nodes);
- return $this->_str;
- }
-
- /**許可されるプロパティを設定します
- * @param Array $param
- */
- public function setAllow($param=array()){
- $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; }
-
- /**処理対象の要素を検索する*/
- プライベート関数 findElements(){
- $nodes = array();
- preg_match_all("/< ;( [^ !/>n]+)([^>]*)>/i", $this->_str, $elements);
- foreach($elements[1] as $el_key => ; $要素){
- if($elements[2][$el_key]){
- $literal = $elements[0][$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 処理対象の配列 $nodes 要素
- */
- プライベート関数 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; ;
- }
- $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 は特殊なケースを許可します
- * @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])){
- 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
- */
- private function protected($str){
- $conversions = array(
- "^" => "^",
- "[" => "[",
- "." => "."、
- "$" => "{"、
- "(" => "("、
- "\" => "\\"、
- "/" => "/"、
- "+" => "+"、
- ")" => ")"、
- "|" => "|"、
- "<"、
- ">"
- return strtr($str, $conversions);
- }
-
- } // 授業終了
-
- ?>
-
-
-
- 复制代
-
2、デモ例
-
- require('HtmlAttributeFilter.class.php');
-
- $str = '';
-
- $obj = new HtmlAttributeFilter()// ID 属性を許可
- $ obj->setAllow(array('id'));
-
- $obj->setException(array(
- 'a' => array('href'), // タグは、href 属性の特殊なケースを許可します
- ' ul' => array('class') // ul タグはクラス属性の特殊なケースを許可します
-
- // img タグは無視され、属性はフィルタされません
- $obj->setIgnore(array) ('img') );
-
- echo 'ソース str:
';
- echo htmlspecialchars($str).'
'; ;
- echo htmlspecialchars( $obj->strip($str));
- ?>
-
-
- PHPフィルタリングHTMLタグ属性クラスのソースコードダウンロードアドレスをコピーします
-
|