php实现的可以设置过滤及保留相关属性的代码,有需要的朋友可以参考下。代码如下:
\^, [ => \[, . => \., $ => \$, { => \{, * => \*, ( => \(, \\ => \\\\, / => \/, + => \+, ) => \), | => \|, ? => \?, \ => \> ); return strtr( $str, $conversions ); } class cleanhtml{ public $str = ''; public $allow = array(); public $exceptions = array(); public $ignore = array(); public function strip( $str ) { $this->str = $str; if( is_string( $str ) && strlen( $str ) > 0 ) { $res = $this->findelements(); if( is_string( $res ) ) return $res; $nodes = $this->findattributes( $res ); $this->removeattributes( $nodes ); } return $this->str; } private function findelements() { # create an array of elements with attributes $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 ); } } # return the xml if there were no attributes to remove if( !$nodes[0] ) return $this->str; else return $nodes; } private function findattributes( $nodes ) { # extract attributes 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; } private function removeattributes( $nodes ) { # remove unwanted attributes foreach( $nodes as $node ) { # check if node has any attributes to be kept $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->exceptions ) ) $new_attributes = $this->createattributes( $new_attributes, $attribute['name'], $attribute['value'] ); } } $replacement = ( $new_attributes ) ? : ; $this->str = preg_replace( '/'. reg_escape( $node['literal'] ) .'/', $replacement, $this->str ); } } private function isexception( $element_name, $attribute_name, $exceptions ) { if( array_key_exists($element_name, $this->exceptions) ) { if( in_array( $attribute_name, $this->exceptions[$element_name] ) ) return true; } return false; } private function createattributes( $new_attributes, $name, $value ) { if( $new_attributes ) $new_attributes .= ; $new_attributes .= $name=\$value\; return $new_attributes; } } ?>
2、调用示例:allow = array( 'id' ); $sa->exceptions = array( 'img' => array( 'src', 'alt' ), 'a' => array( 'href', 'title' ), 'iframe'=>array('src','frameborder'), ); echo $str = $sa->strip( $str );?>