- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
所以我试图设置“内容”类的高度,但它似乎不起作用。我对嵌套 DIV 非常陌生,我已经尝试了我在谷歌搜索中发现的修复程序,但似乎没有任何效果。帮助?
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
基本上,我的问题很简单,但它需要知道 Struts 1.1 并且还活着的人。 我尝试构建的伪代码看起来像这样: IF element.method1 = true THEN IF element
我正在尝试将 Excel 嵌套 IF 语句转换为代码语言,但我不确定我是否正确执行此操作,希望能得到一些帮助 这是Excel语句: =IF(D3="Feather",IF(OR(I3>1000,R3=
如果我们创建两个或三个评论并对其进行多次回复,则“有用”链接在单击时会导致问题,它会对具有相同编号的索引执行 ng-click 操作,从而显示具有相同索引的所有文本。如何解决此嵌套问题,以便在单击链接
我在项目中使用Scala,想与Stripe集成,但它只提供Java API。例如,要创建 session ,我使用: val params = new util.HashMap[String, Any
以下代码有一个 Div,其中连续包含四个较小的 Div。四个 Div 中的每一个还包含一个较小的 Div,但此 Div 未显示。我尝试了各种显示和位置组合,看看 div 是否会出现。 classGoa
我在这里有一个问题,循环是: for (i=0; i < n; ++i) for (j = 3; j < n; ++j) { ...
我正在尝试编写代码来显示具有奇数宽度的形状。形状完成后,将其放置在外部形状内。用户将能够输入用于形状的字符和行数。我希望生成一个形状,并通过 for 循环生成一个外部形状。 ***** .
$(".globalTabs").each(function(){ var $globalTabs = $(this); var parent = $globalTabs.parent
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
所以我在这个问题上遇到了一些麻烦,因为变量 i。我只是不确定在第二个 while 循环中如何处理它。对于我的外循环,我知道它将运行 log_4(n^2) 次迭代。对于内部 while 循环,我计算的迭
我似乎找不到在枚举上应用多个 if/then 逻辑的工作方式。 anyOf 不应用条件逻辑,而是表示如果其中任何一个匹配则很好。 allOf 再次不应用条件逻辑,而是测试属性/必填字段的超集。 这是一
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
这个问题在这里已经有了答案: Add leading zeroes/0's to existing Excel values to certain length (7 个回答) 7年前关闭。 我正在寻
我已经绑定(bind)了很多 AND/OR 函数的组合并且没有运气。 这是我需要创建的: 在 B 列中,我有公司 ID,范围从两个数字字符到六个数字字符。 我需要在 B 列中的每个公司 ID 之前的每
我是 VBA 新手,在尝试编写的宏中使用 If 语句时遇到了一些困难。每个月我都会收到一份 Excel 报告,其中列出了我们公司的哪些员工执行了某些任务。我正在编写的宏旨在将每个员工的数据复制并粘贴到
如果在 B 列中找到单元格 A1 中的值,则使用文本 321 填充除非在 C 列中找到单元格 A1 中的值,在这种情况下填充文本 121反而。如果单元格 A1 的内容不在 B 列或 C 列中,则使用
我有几十万个地址。其中一些在整数之后有粒子。如 4356 A Horse Avenue , 其他格式正常4358 Horse Avenue .有些有“A”,有些有“B”。我正在尝试删除整数和粒子之间的
我是一名优秀的程序员,十分优秀!