从事PHP开发很多年了,也写过些小项目,经常要在后台生成前端输出的HTML脚本,说白了就是把HTML语言以字符串的方式嵌入在PHP的输入语句中,单纯的输出没什么问题,但遇到DOM修改时很是麻烦,要做各种查找与替换,还要写一大堆正则,反反复复,效率极低。也用过网上的一些PHP操作DOM的开源项目,不过问题多多,要么就停更很久了,要么不完善,我在写代码这个问题上是个不将就的人,所以,就自己想整一个这么个项目,我的目的很简单,就是要在PHP里操作DOM就像Jquery一样,能生成,能解析,还要能符合目前H5及CSS3的特性。我准备花点时间来记录这一过程,应该要分几个章节来写,我的环境是LAMP,PHP基于PHP7.3版本。先来说一下书写规则。对了,这是我在简书上写的第一篇文章,所以态度上我是很认真的。我给这个项目取名叫SPEEDX,很多命名前缀我会带上这个项目名,为什么呢,因为PHP中我特别不喜欢命名空间这么个玩意,不知为什么,性格如此。

往往想象很美好的事情,现实确很骨感。为了达到对DOM及CSS精准操作的目的,不搞大杂会,为此我仔细分析了一下,本项目操作主要对像应该这样分类:

1. CSS类:`.className{属性列表}`

2. CSS属性 : `vName: value`

3. DOM标签 诸如`

4. DOM属性,如: `

5. DOM节点基本内容: 就是节点内的内容,也可以人包含其它节点

为此,我弄了个比较详细的config文件,其中定义的HTML及CSS中所用的标签、属性及相关浏览器的支持情况。其中重要的几项常量定义我做一下说明:

  • SPEEDX_STYLE_NULL = 0;//CSS3标准,但还没有浏览器实现
  • SPEEDX_STYLE_W3C = 1; //W3C标准属性:表示支持这一属性或支持这一属性值的浏览器都是采用标准格式,即不带浏览器前缀的书写方式;
  • SPEEDX_STYLE_MOZ = 2; //火狐浏览器内核(-moz-):表示支持这一属性或属性值的火狐浏览器在书写格式上要带"-moz-"前缀;
  • SPEEDX_STYLE_WEBKIT = 4; //Chrome和Safari浏览器内核:表示支持这一属性或属性值的浏览器在CSS书写格式上要带"-webkit-"前缀;
  • SPEEDX_STYLE_MS = 8; //IE浏览器内核:IE支持的CSS特性,要加"-ms-"前缀
  • SPEEDX_STYLE_O = 16; //Opera浏览器内核:对于兼容部分Opera浏览器,CSS特性前要加"-o-"前缀
  • SPEEDX_STYLE_ALL = 31; //所有兼容模式,为了兼容大部分主流浏览器的不同版本,要加上上面所有的前缀。

具体配置如下:文件中已备注说明:

<?php /** * speedx版本及版本号 */ const SPEEDX_VARNAME = "0.1.1"; const SPEEDX_VARCODE = 1; const SPEEDX_ARCHI_BOOTSTRAP = "SPEEDX_ARCHI_BOOTSTRAP"; const SPEEDX_ARCHI_SEMANTIC = "SPEEDX_ARCHI_SEMANTICUI"; const COMPACT_TO_STRING = 0;//用于函数speedxCompactJs(),此常量表示压缩后的js以字符串的方式返回; const COMPACT_TO_FILE = 1;//:用于函数speedxCompactJs(),此常量表示压缩后的js存储到指定的js文件;  const SPEEDX_REQUEST_GET = "SPEEDX_REQUEST_GET";  const SPEEDX_REQUEST_POST = "SPEEDX_REQUEST_POST"; /** * 格式化输出时每一行结尾要附加的字符 */ const SPEEDX_RN = ""; const SPEEDX_BR = ""; const SPEEDX_NIL = ""; $SPEEDX_FORMAT_LINE_END = SPEEDX_NIL; /** * 格式化输出时新行前导字符 */ const SPEEDX_FORMAT_FIX_HTML = " "; const SPEEDX_FORMAT_FIX_SPACE = " "; $SPEEDX_FORMAT_LINE_HEAD = SPEEDX_NIL; /* ***异常处理类所用到的常定义: ***调用主文件:_SPEEDX_CLASS_PHP_/class.speedx_error_debuger.php  */ const SPEEDX_STDOUT_NULL = 0; //信息屏蔽 const SPEEDX_STDOUT_SCREEN = 1;//信息输出至屏幕 const SPEEDX_STDOUT_FILE = 2;//信息输出至文件 const SPEEDX_STDOUT_WEBSOCKET = 3;//信息输出至后台管理员 const SPEEDX_STDOUT_DB = 4;//信息输出至数据库 const SPEEDX_DUBUG_DATATABLE = "exception"; //异常记录数据库表名称,表结构为固定结构,详见表定义 $_SPEEDX_DEBUGLOG = _SPEEDX_LOG_ . "speedx_debug.log"; $_DEBUG_TYPE = SPEEDX_STDOUT_FILE; //自定义异常输入方式,生产时请设置为:DEBUG_TO_LOG $_SPEEDX_ERRLOG = _SPEEDX_LOG_ . "speedx_error.log"; //自定义异常日志文件 $_ERR_TYPE = SPEEDX_STDOUT_FILE; //自定义异常输入方式,生产时请设置为:ERR_TO_LOG /** * speedx_domnodes类在解析时节点的状态 */ const SPEEDX_DOMNODE_TAG_START = 1;//解析节点需要起始标签 const SPEEDX_DOMNODE_TAG_END = 2;//解析节点需要结束标签 const SPEEDX_DOMNODE_CLOSE = 3;//解析节点禁止节点操作 /** * 自定义输入的错误级别 * 自定输出的信息不受全局环境设置影响,始终会输出到终端 */ const SPEEDX_ERR_LEVEL_NORMAL = 0; //常规信息 const SPEEDX_ERR_LEVEL_SUCCESS = 1; //突出信息 const SPEEDX_ERR_LEVEL_WARNING = 2; //警告信息 const SPEEDX_ERR_LEVEL_DANGER = 3; //危险信息 const SPEEDX_ERR_LEVEL_ERROR = 4; //错误信息  const SPEEDX_RETURN_OK = 1; //全局错误返回类中错误信息: 正确 const SPEEDX_RETURN_ERR = 0; //全局错误返回类中错误信息: 错误 const SPEEDX_RETURN_NODEFINE = -1;//全局错误返回类中错误信息: 未定义 /* ***speedx节点常量: ***调用主文件:_SPEEDX_CLASS_PHP_/class.speedx.php -> class speedx_node{}  */ const SPEEDX_NODE_DOCTYPE = "_doctype_"; //doctype类型 const SPEEDX_NODE_STANDARD = "_standard_"; //标准对称标签 const SPEEDX_NODE_SINGLE = "_single_"; //单标签内容 const SPEEDX_NODE_META = "_meta_"; //meta标签 const SPEEDX_NODE_COMMENT = "_comment_"; //备注标签 const SPEEDX_NODE_TEXT = "_text_"; //文本内容 const SPEEDX_NODE_VAR = "_var_"; //变量标签,用于PHP内容替换 const SPEEDX_NODE_NULL = "_null_"; //空内容标签 const SPEEDX_NODE_STYLE = "_style_"; //style标签 const SPEEDX_NODE_SCRIPT = "_script_"; //脚本标签 const SPEEDX_NODE_PHP = "_php_"; //保留的:php脚本标签,用于后期扩展 const SPEEDXNODE_DOCTYPE = 1;  const SPEEDXNODE_STANDARD = 2; const SPEEDXNODE_SINGLE = 4;  const SPEEDXNODE_META = 8; const SPEEDXNODE_COMMENT = 16; const SPEEDXNODE_TEXT = 32; const SPEEDXNODE_VAR = 64; const SPEEDXNODE_STYLE = 128; const SPEEDXNODE_SCRIPT = 256; const SPEEDXNODE_PHP = 512; const SPEEDXNODE_NULL = 1024; /* ***doctype类型声明: ***  */ const DOCTYPE_HTML5 = ''; const DOCTYPE_HTML_4_01_STRICT = ''; const DOCTYPE_HTML_4_01_TRANSITIONAL = ''; const DOCTYPE_HTML_4_01_FRAMESET = ''; const DOCTYPE_XHTML_1_0_STRICT = ''; const DOCTYPE_XHTML_1_0_TRANSITIONAL = ''; const DOCTYPE_XHTML_1_0_FRAMESET = ''; const DOCTYPE_XHTML_1_1 = ''; /* ***HTML标签列表 */ $SPEEDX_NODE_TYPE = []; $SPEEDX_NODE_TYPE[SPEEDX_NODE_DOCTYPE] = ["doctype

php去除html标签_用PHP操作DOM (一)相关推荐

  1. php去除img,PHP如何去除IMG标签?_后端开发

    go语言中一些字符串操作介绍_后端开发 Go语言中字符串的字节使用UTF-8编码表示Unicode文本,因此Go语言字符串是变宽字符序列,本文就来为大家介绍一些go语言中字符串的操作. PHP如何去除 ...

  2. 去除标签_有效去除“狗皮膏药”标签,快学起来吧

    去除商品标签向来是比较头疼一件事,有时候在去掉标签后会留下粘性残留物,它会粘上灰尘和其他脏东西,把表面变成脏兮兮的颜色,让人看着太不舒服了.其实去除标签残留粘胶并不难,可能家里就有去除它的工具哦~那今 ...

  3. jsf用于页面判断的标签_用于操作和导航的JSF命令组件标签

    jsf用于页面判断的标签 JSF provides two command component tags for performing action and navigation. They are ...

  4. python对输入的字符串进行解析_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  5. python加密字符串小写字母循环后错两位_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  6. php去除编辑器html标签,js处理富文本编辑器转义、去除转义、去除HTML标签

    富文本编辑器生成的HTML标签,进行转义,然后写入数据库,防止脚本注入: function htmlEncode(value){ return $(' } 从数据库拿出的转义后的HTML标签内容,先得 ...

  7. JS中编写函数去除HTML标签,js函数获取html中className所在的内容并去除标签

    js函数获取html中className所在的内容并去除标签 复制代码 代码如下: function queryClass(classnames){ var classobj= new Array() ...

  8. matplotlib可视化去除轴标签、轴刻度线和轴刻度数值实战:Axis Text Ticks or Tick Labels

    matplotlib可视化去除轴标签.轴刻度线和轴刻度数值实战:Axis Text Ticks or Tick Labels 目录

  9. xml显示浏览器标签_浅析浏览器书签的导入和导出

    浏览器有个实用的功能,但是可能用的频率不高,就是书签/收藏的导入和导出,因为现在一般浏览器都有云同步功能,所以这个功能存在感不强. 浏览器书签是可以跨不同的浏览器导入的,所以意味着导出的文件肯定是有一 ...

最新文章

  1. “AS3.0高级动画编程”学习:第二章转向行为(上)
  2. 检测实现OpenCV2.4.4实现Shi-Tomasi角点检测(goodFeaturesToTrack)
  3. [WorldWind学习]12.WavingFlags和WavingFlagLayer
  4. 如何简化临时内存的分配与释放
  5. Linux-/proc目录简介
  6. JavaSE基础知识(5)—面向对象(5.3访问修饰符)
  7. Android 帧动画,加载动画,AnimationDrawable,仿京东加载动画
  8. raft算法mysql主从复制_mysql主从复制原理
  9. va_start、va_end、va_arg 实现可变长参数
  10. webpack5的tree-shaking值得了解
  11. JS表单学习笔记(思维导图)
  12. pythonmatplot可视化_python:matplotlib基础数据可视化,pythonmatplotlib
  13. scala中的if esle使用
  14. 功能增强的进度条控件(源码)
  15. jenkins下载插件下载不了,解决办法
  16. LeetCode刷题笔记一:(两数之和)
  17. iOS——应用内调用Face ID、Touch ID
  18. 微信小程序canvas画价格走势图(六)
  19. 零基础学基金投资系列-08-基金排行榜
  20. 末学者笔记--apache编译安装及LAMP架构上线

热门文章

  1. TCL 过程proc
  2. 基于MATLAB的车牌定位和识别
  3. C++继承机制下的析构函数
  4. C++常量指针this
  5. 用VS 2008开发WCF(一)——最快速的WCF入门
  6. 折腾Java设计模式之建造者模式
  7. Fedora 13 Alpha测试手记横空出世
  8. [BZOJ4403]序列统计
  9. CISCO NAT 配置
  10. Bitbucket Pipelines在Atlassian的Bitbucket云上提供持续交付功能