- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
fixHtmlTag version 0.2 这个版本解决了上次遗留的问题,即就近闭合和嵌套闭合问题。具体可以看代码的注释。 。
复制代码代码如下
<?php /** * fixHtmlTag * * HTML标签修复函数,此函数可以修复未正确闭合的 HTML 标签 * * 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和 * “就近闭合模式”,应该够用了。 * * 这两种模式是我为了解释清楚此函数的实现而创造的两个名词, * 只需明白什么意思就行。 * 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "<body><div>你好" * 这样的 html 代码会被修改为 "<body><div>你好</div></body>" * 2,就近闭合模式,CLOSE,这种模式会将形如 "<p>你好<p>为什么没有 * 闭合呢" 的代码修改为 "<p>你好</p><p>为什么没有闭合呢</p>" * * 在嵌套闭合模式(默认,无需特殊传参)下,可以传入需要就近闭合的 * 标签名,通过这种方式将类似 "<body><p>你好</p><p>我也好" 转换为 * "<body><p>你好</p><p>我也好</p></body>"的形式。 * 传参时索引需要按照如下方式写,不需要修改的设置可以省略 * * $param = array( * 'html' => '', //必填 * 'options' => array( * 'tagArray' => array(); * 'type' => 'NEST', * 'length' => null, * 'lowerTag' => TRUE, * 'XHtmlFix' => TRUE, * ) * ); * fixHtmlTag($param); * * 上面索引对应的值含义如下 * string $html 需要修改的 html 代码 * array $tagArray 当为嵌套模式时,需要就近闭合的标签数组 * string $type 模式名,目前支持 NEST 和 CLOSE 两种模式,如果设置为 CLOSE,将会忽略参数 $tagArray 的设置,而全部就近闭合所有标签 * ini $length 如果希望截断一定长度,可以在此赋值,此长度指的是字符串长度 * bool $lowerTag 是否将代码中的标签全部转换为小写,默认为 TRUE * bool $XHtmlFix 是否处理不符合 XHTML 规范的标签,即将 <br> 转换为 <br /> * * @author IT不倒翁 <itbudaoweng@gmail.com> * @version 0.2 * @link http://yungbo.com IT不倒翁 * @link http://enenba.com/?post=19 某某 * @param array $param 数组参数,需要赋予特定的索引 * @return string $result 经过处理后的 html 代码 * @since 2012-04-14 */ function fixHtmlTag($param = array()) { //参数的默认值 $html = ''; $tagArray = array(); $type = 'NEST'; $length = null; $lowerTag = TRUE; $XHtmlFix = TRUE; //首先获取一维数组,即 $html 和 $options (如果提供了参数) extract($param); //如果存在 options,提取相关变量 if (isset($options)) { extract($options); } $result = ''; //最终要返回的 html 代码 $tagStack = array(); //标签栈,用 array_push() 和 array_pop() 模拟实现 $contents = array(); //用来存放 html 标签 $len = 0; //字符串的初始长度 //设置闭合标记 $isClosed,默认为 TRUE, 如果需要就近闭合,成功匹配开始标签后其值为 false,成功闭合后为 true $isClosed = true; //将要处理的标签全部转为小写 $tagArray = array_map('strtolower', $tagArray); //“合法”的单闭合标签 $singleTagArray = array( '<meta', '<link', '<base', '<br', '<hr', '<input', '<img' ); //校验匹配模式 $type,默认为 NEST 模式 $type = strtoupper($type); if (!in_array($type, array('NEST', 'CLOSE'))) { $type = 'NEST'; } //以一对 < 和 > 为分隔符,将原 html 标签和标签内的字符串放到数组中 $contents = preg_split("/(<[^>]+?>)/si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach ($contents as $tag) { if ('' == trim($tag)) { $result .= $tag; continue; } //匹配标准的单闭合标签,如<br /> if (preg_match("/<(\w+)[^\/>]*?\/>/si", $tag)) { $result .= $tag; continue; } //匹配开始标签,如果是单标签则出栈 else if (preg_match("/<(\w+)[^\/>]*?>/si", $tag, $match)) { //如果上一个标签没有闭合,并且上一个标签属于就近闭合类型 //则闭合之,上一个标签出栈 //如果标签未闭合 if (false === $isClosed) { //就近闭合模式,直接就近闭合所有的标签 if ('CLOSE' == $type) { $result .= '</' . end($tagStack) . '>'; array_pop($tagStack); } //默认的嵌套模式,就近闭合参数提供的标签 else { if (in_array(end($tagStack), $tagArray)) { $result .= '</' . end($tagStack) . '>'; array_pop($tagStack); } } } //如果参数 $lowerTag 为 TRUE 则将标签名转为小写 $matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1]; $tag = str_replace('<' . $match[1], '<' . $matchLower, $tag); //开始新的标签组合 $result .= $tag; array_push($tagStack, $matchLower); //如果属于约定的的单标签,则闭合之并出栈 foreach ($singleTagArray as $singleTag) { if (stripos($tag, $singleTag) !== false) { if ($XHtmlFix == TRUE) { $tag = str_replace('>', ' />', $tag); } array_pop($tagStack); } } //就近闭合模式,状态变为未闭合 if ('CLOSE' == $type) { $isClosed = false; } //默认的嵌套模式,如果标签位于提供的 $tagArray 里,状态改为未闭合 else { if (in_array($matchLower, $tagArray)) { $isClosed = false; } } unset($matchLower); } //匹配闭合标签,如果合适则出栈 else if (preg_match("/<\/(\w+)[^\/>]*?>/si", $tag, $match)) { //如果参数 $lowerTag 为 TRUE 则将标签名转为小写 $matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1]; if (end($tagStack) == $matchLower) { $isClosed = true; //匹配完成,标签闭合 $tag = str_replace('</' . $match[1], '</' . $matchLower, $tag); $result .= $tag; array_pop($tagStack); } unset($matchLower); } //匹配注释,直接连接 $result else if (preg_match("/<!--.*?-->/si", $tag)) { $result .= $tag; } //将字符串放入 $result ,顺便做下截断操作 else { if (is_null($length) || $len + mb_strlen($tag) < $length) { $result .= $tag; $len += mb_strlen($tag); } else { $str = mb_substr($tag, 0, $length - $len + 1); $result .= $str; break; } } } //如果还有将栈内的未闭合的标签连接到 $result while (!empty($tagStack)) { $result .= '</' . array_pop($tagStack) . '>'; } return $result; } 。
最后此篇关于PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)的文章就讲到这里了,如果你想了解更多关于PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的 processmaker 安装遇到了一些问题。我正在尝试使用本指南 [url]http://wiki.processmaker.com/index.php/ProcessMaker_Ubuntu
我正在使用 ShareKit。发送 SMS 消息使用 MFMessageComposeViewController,用户看到标题“文本”。我想将该标题更改为更能反射(reflect)实际可用内容的内容
我需要在我的一个针对 Gingerbread 的 Android 应用程序中使用操作栏和 fragment 的组合。所以我使用了 v7 支持库中的操作栏和 v4 支持库中的 fragment ,并使用
我明白为什么浏览器 vendor 不想帮助我阻止他们的 UI 线程。但是,我不明白为什么会有: Web Workers 中没有 sleep (2) 没有同步 WebSockets API 有一个syn
最近我的组织正在考虑使用 Docker。我们组使用的是cloudera CDH 5.1.2。 1) cloudera 是否与 Docker 容器兼容?2) docker 和cloudera 组合是否存
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
我一直在使用 PyDev 成功运行 nose 测试,并想试试 nose2。 所以我安装了它 pip install nose2 复制/粘贴来自 http://nose2.info/ 的示例代码进入名为
我想知道 LLVM 中是否有任何函数/方法可以在 LLVM IR 中添加 Open-MP 构造。 llvm-3.0 是否仍然支持 OpenMP 指令? 最佳答案 OpenMP 是一种高级语言扩展。因此
我对 CUDA 编程非常陌生。我正在浏览 SDK 附带的示例。我能够编译代码,但是当我运行它时,出现以下错误: "clock.cu(177) : CUDA Runtime API error 38:
RStudio 是用于 R 开发的出色 IDE。我想知道是否有任何方法可以很好地支持 HiDPI 分辨率? 我目前有 13 英寸显示器和 3200x1800 分辨率,甚至很难阅读 RStudio 选项
我正在寻找一种有助于为 Django 项目提供 RDF 支持的工具。 到目前为止,我发现了两个: django-rdf - 最后一次修改是在 4 年前,所以它看起来像是一个死项目。 djubby -
我刚刚尝试了一些 JS 核心原则,发现引擎评估链接的关系运算符而不会引发错误。相反,他们以我自己无法理解的方式进行评估。 console.log(1 4 > 3 > 2 > 1); //false,
我知道 etexteditor 和 vim/emacs。 是否有任何其他 Windows 编辑器支持类似 textmate 的片段(例如,您编写触发词,按 Tab,它更改为某些内容,再次按 Tab,它
我正在尝试找出验证给定集群的网络策略配置的最佳方法。 According to the documentation Network policies are implemented by the ne
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
Z3 会支持 AUFBV 吗? 对于以下脚本: (set-logic AUFBV) (declare-fun x () (_ BitVec 16)) (declare-const t (Array (
使用分部类编写 NUnit 测试的优缺点是什么? 我要开始了: 亲:可以测试私有(private)方法 缺点:TDD 不再可能了 还有什么? 最佳答案 缺点:要么您必须测试与您发布的版本不同的构建,要
它很容易(对于 90% 的 aop 特性)在没有任何语言本身支持的情况下做到这一点,就像大多数动态语言如 python 和 ruby 一样。然而,Dojo在 1.3.2 上直接支持它.最新版本发生
我在我的 android 应用程序中使用亚洲字符,我已经了解到某些字符无法显示,因为系统字体不支持它们。我查询了一个包含亚洲字符的数据库,并且经常检索到无法显示的标志。这些情况对我的应用程序来说通常不
你好,我想实现一个控件,我想在用户键入@字符时启用该控件,直到未填充运行文本中的空格为止,它应该显示用户列表,@符号后键入的文本应该显示基于键盘字符的建议,就像我们在上面看到的那样Twitter 或
我是一名优秀的程序员,十分优秀!