php过滤html标记属性类用法实例_php技巧

本文实例讲述了php 过滤html标记属性类及其用法。是PHP项目开发中比较常见的实用技巧。分享给大家供大家参考。具体方法如下:

HtmlAttributeFilter.class.php类文件如下:

<?php
/** HTML Attribute Filter
*  Date:  2013-09-22
*  Author: fdipzone
*  ver:  1.0
*
*  Func:
*  public strip       过滤属性
*  public setAllow      设置允许的属性
*  public setException    设置特例
*  public setIgnore     设置忽略的标记
*  private findElements    搜寻需要处理的元素
*  private findAttributes   搜寻属性
*  private removeAttributes  移除属性
*  private isException    判断是否特例
*  private createAttributes  创建属性
*  private protect      特殊字符转义
*/ 

class HtmlAttributeFilter{ // class start 

  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 strip($str){
    $this->_str = $str; 

    if(is_string($this->_str) && strlen($this->_str)>0){ // 判断字符串 

      $this->_str = strtolower($this->_str); // 转成小写 

      $res = $this->findElements();
      if(is_string($res)){
        return $res;
      }
      $nodes = $this->findAttributes($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;
  } 

  /** 搜寻需要处理的元素 */
  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;
    }
  } 

  /** 搜寻属性
  * @param Array $nodes 需要处理的元素
  */
  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;
  } 

  /** 移除属性
  * @param Array $nodes 需要处理的元素
  */
  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);
    }
  } 

  /** 判断是否特例
  * @param String $element_name  元素名
  * @param String $attribute_name 属性名
  * @param Array $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;
  } 

  /** 特殊字符转义
  * @param String $str 源字符串
  * @return String
  */
  private function protect($str){
    $conversions = array(
      "^" => "\^",
      "[" => "\[",
      "." => "\.",
      "$" => "\$",
      "{" => "\{",
      "*" => "\*",
      "(" => "\(",
      "\\" => "\\\\",
      "/" => "\/",
      "+" => "\+",
      ")" => "\)",
      "|" => "\|",
      "?" => "\?",
      "<" => "\<",
      ">" => "\>"
    );
    return strtr($str, $conversions);
  } 

} // class end 

?>

demo示例代码如下:

<?php
require('HtmlAttributeFilter.class.php'); 

$str = '<div class="bd clearfix" id="index_hilite_ul"><ul class="list"><li><img src=https://yunqi-tech.oss-cn-hangzhou.aliyuncs.com/error.html width="118" height="148"><div class="cover"><a class="text" href="http://www.jb51.net"><strong>yuna</strong><p>love</p></a><strong class="t g">want to know</strong><a href="/login.html" class="ppBtn"><strong class="text">YES</strong></a></div></li></ul></div>'; 

$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:<br>';
echo htmlspecialchars($str).'<br><br>';
echo 'filter str:<br>';
echo htmlspecialchars($obj->strip($str));
?> 

本文完整源码点击此处本机下载。

希望本文所述对大家的PHP程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索html
, php
, 类
, 标记
, 属性
过滤
iframe用法实例、java枚举类的用法实例、java map用法 实例、ajax用法实例、java过滤器实例,以便于您获取更多的相关知识。

时间: 2024-10-26 05:45:39

php过滤html标记属性类用法实例_php技巧的相关文章

php过滤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 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 7

PHP遍历文件夹与文件类及处理类用法实例_php技巧

本文实例讲述了PHP遍历文件夹与文件类及处理类用法,非常具有实用价值.分享给大家供大家参考.具体方法如下: FindFile.class.php类文件用于遍历目录文件,具体代码如下: <?php /** 遍历文件夹及文件类 * Date: 2013-03-21 * Author: fdipzone * Ver: 1.0 */ class FindFile{ public $files = array(); // 存储遍历的文件 protected $maxdepth; // 搜寻深度,0表示没有

php中Snoopy类用法实例_php技巧

本文实例讲述了php中Snoopy类用法.分享给大家供大家参考.具体分析如下: 这里演示了php中如何通过Snoopy抓取网页信息 snoopy类的下载地址:http://sourceforge.net/projects/snoopy/ /* You need the snoopy.class.php from http://snoopy.sourceforge.net/ */ include("snoopy.class.php"); $snoopy = new Snoopy; //

php的ZipArchive类用法实例_php技巧

本文实例讲述了php的ZipArchive类用法,分享给大家供大家参考.具体如下: 通常来说,php5.2开始支持ZipArchive类,php4只能使用zip函数.其实在官方实现zip类之前,已经有大牛贡献了打包解压zip文件的方法.现在php包含了ZipArchive类,当然优先使用.使用该类能创建和解压zip文件,也能直接读取zip压缩包内的内容,很方便,这里主要总结下读取和解压的过程. 解压一个包到指定目录: 复制代码 代码如下: <?php $zip = new ZipArchive;

php常用表单验证类用法实例_php技巧

本文实例讲述了php常用表单验证类用法.分享给大家供大家参考.具体如下: <?php /** * 页面作用:常用表单验证类 * 作 者:欣然随风 * QQ:276624915 */ class class_post { //验证是否为指定长度的字母/数字组合 function fun_text1($num1,$num2,$str) { Return (preg_match("/^[a-zA-Z0-9]{".$num1.",".$num2."}$/&q

php文件压缩之PHPZip类用法实例_php技巧

本文实例讲述了php文件压缩之PHPZip类用法.分享给大家供大家参考.具体如下: <?php // // PHPZip v1.2 by Sext (sext@neud.net) // // Makes zip archive // // Based on "Zip file creation class", uses zLib // // class PHPZip { function Zip($dir, $zipfilename) { if (@function_exists

php广告加载类用法实例_php技巧

本文实例讲述了php广告加载类的用法,非常实用.分享给大家供大家参考.具体方法如下: 该php广告加载类,支持异步与同步加载.需要使用Jquery实现. ADLoader.class.php类文件如下: <?php /** 广告加载管理类 * Date: 2013-08-04 * Author: fdipzone * Ver: 1.0 * * Func: * public load 加载广告集合 * public setConfig 广告配置 * private getAds 根据channel

php生成rss类用法实例_php技巧

本文实例讲述了php生成rss类用法,分享给大家供大家参考.具体如下: <?php require('rssbuilder.class.php'); header('Content-Type: application/xml; charset=UTF-8'); header('Cache-Control: no-cache, must-revalidate'); header('Expires: Fri, 14 Mar 1980 20:53:00 GMT'); header('Last-Modi

PHP封装的HttpClient类用法实例_php技巧

本文实例讲述了PHP封装的HttpClient类.分享给大家供大家参考.具体分析如下: 这是一段php封装的HttpClient类,可实现GET POST Cookie Session等简单的功能.原来做过,这两天重新修改了一下. <?php /* * Filename: httpclient.php * Created on 2012-12-21 * Created by RobinTang * To change the template for this generated file go