Rumah pembangunan bahagian belakang tutorial php PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)_PHP

PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)_PHP

Jun 01, 2016 pm 12:11 PM
teg html

fixHtmlTag
version 0.2
这个版本解决了上次遗留的问题,即就近闭合和嵌套闭合问题。具体可以看代码的注释。
复制代码 代码如下:

/**
* fixHtmlTag
*
* HTML标签修复函数,此函数可以修复未正确闭合的 HTML 标签
*
* 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
* “就近闭合模式”,应该够用了。
*
* 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
* 只需明白什么意思就行。
* 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "

你好"
* 这样的 html 代码会被修改为 "
你好
"
* 2,就近闭合模式,CLOSE,这种模式会将形如 "

你好

为什么没有
* 闭合呢" 的代码修改为 "

你好

为什么没有闭合呢

"
*
* 在嵌套闭合模式(默认,无需特殊传参)下,可以传入需要就近闭合的
* 标签名,通过这种方式将类似 "

你好

我也好" 转换为
* "

你好

我也好

"的形式。
* 传参时索引需要按照如下方式写,不需要修改的设置可以省略
*
* $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 规范的标签,即将
转换为

*
* @author IT不倒翁
* @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(
''''
'
''PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)_PHP);

//校验匹配模式 $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;
}

//匹配标准的单闭合标签,如

if (preg_match("/]*?\/>/si", $tag)) {
$result .= $tag;
continue;
}

//匹配开始标签,如果是单标签则出栈
else if (preg_match("/]*?>/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('//开始新的标签组合
$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("/]*?>/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) $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;
}
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara mengekstrak kandungan teg HTML menggunakan ungkapan biasa dalam bahasa Go Cara mengekstrak kandungan teg HTML menggunakan ungkapan biasa dalam bahasa Go Jul 14, 2023 pm 01:18 PM

Cara menggunakan ungkapan biasa untuk mengekstrak kandungan teg HTML dalam bahasa Go Pengenalan: Ungkapan biasa ialah alat padanan teks yang berkuasa dan ia juga digunakan secara meluas dalam bahasa Go. Dalam senario pemprosesan teg HTML, ungkapan biasa boleh membantu kami mengekstrak kandungan yang diperlukan dengan cepat. Artikel ini akan memperkenalkan cara menggunakan ungkapan biasa untuk mengekstrak kandungan teg HTML dalam bahasa Go dan memberikan contoh kod yang berkaitan. 1. Memperkenalkan pakej berkaitan Pertama, kita perlu mengimport pakej berkaitan: regexp dan fmt. pakej regexp menyediakan

Bagaimana untuk mengalih keluar tag HTML menggunakan ungkapan biasa Python Bagaimana untuk mengalih keluar tag HTML menggunakan ungkapan biasa Python Jun 22, 2023 am 08:44 AM

HTML (HyperTextMarkupLanguage) ialah bahasa standard untuk mencipta halaman Web Ia menggunakan tag dan atribut untuk menerangkan pelbagai elemen pada halaman, seperti teks, imej, jadual, pautan, dll. Walau bagaimanapun, apabila memproses teks HTML, sukar untuk mengekstrak kandungan teks dengan cepat untuk pemprosesan seterusnya. Pada masa ini, kita boleh menggunakan ungkapan biasa dalam Python untuk mengalih keluar teg HTML untuk mengekstrak teks biasa dengan cepat. Dalam Python, jadual biasa

Bagaimana untuk mengalih keluar tag HTML daripada rentetan dalam PHP? Bagaimana untuk mengalih keluar tag HTML daripada rentetan dalam PHP? Mar 23, 2024 pm 09:03 PM

PHP ialah bahasa skrip sebelah pelayan yang biasa digunakan yang digunakan secara meluas dalam pembangunan laman web dan pembangunan aplikasi back-end. Apabila membangunkan tapak web atau aplikasi, anda sering menghadapi situasi di mana anda perlu memproses tag HTML dalam rentetan. Artikel ini akan memperkenalkan cara menggunakan PHP untuk mengalih keluar tag HTML daripada rentetan dan memberikan contoh kod khusus. Mengapa anda perlu mengalih keluar tag HTML? Tag HTML selalunya disertakan semasa memproses input pengguna atau teks yang diperoleh daripada pangkalan data. Kadangkala kami ingin mengalih keluar tag HTML ini apabila memaparkan teks

php中怎么转义html标签 php中怎么转义html标签 Feb 24, 2021 pm 06:00 PM

在PHP中,可以使用htmlentities()函数来转义html,能把字符转换为HTML实体,语法“htmlentities(string,flags,character-set,double_encode)”。PHP中也可以使用html_entity_decode()函数来反转义html,把HTML实体转换为字符。

Bagaimana untuk mengalih keluar tag HTML daripada rentetan yang diberikan dalam Java? Bagaimana untuk mengalih keluar tag HTML daripada rentetan yang diberikan dalam Java? Aug 29, 2023 pm 06:05 PM

String ialah kelas akhir dalam Java, ia tidak boleh diubah, yang bermaksud kita tidak boleh menukar objek itu sendiri, tetapi kita boleh menukar rujukan objek. Teg HTML boleh dialih keluar daripada rentetan yang diberikan menggunakan kaedah replaceAll() kelas String. Kami boleh mengalih keluar teg HTML daripada rentetan yang diberikan menggunakan ungkapan biasa. Selepas mengalih keluar tag HTML daripada rentetan, ia mengembalikan rentetan sebagai teks biasa. Contoh sintaks publicStringreplaceAll(Stringregex,Stringreplacement) publicclassRemoveHTMLTagsTest{&nbs

Bagaimana untuk menggunakan tag HTML dalam jadual HTML? Bagaimana untuk menggunakan tag HTML dalam jadual HTML? Sep 08, 2023 pm 06:13 PM

Kita boleh dengan mudah menambah tag HTML dalam jadual. Teg HTML hendaklah diletakkan di dalam teg <td>. Contohnya, tambahkan perenggan <p>…</p> teg atau teg lain yang tersedia di dalam teg <td>. Sintaks Berikut ialah sintaks untuk menggunakan tag HTMl dalam jadual HTML. <td><p>Paragraphofthecontext</p><td>Contoh 1 Contoh penggunaan tag HTML dalam jadual HTML diberikan di bawah. <!DOCTYPEhtml><html><head&g

Kaedah ungkapan biasa PHP untuk mengesahkan tag HTML asas Kaedah ungkapan biasa PHP untuk mengesahkan tag HTML asas Jun 24, 2023 am 08:07 AM

PHP ialah bahasa pembangunan web yang cekap yang menyokong fungsi ekspresi biasa dan boleh mengesahkan kesahihan data input dengan cepat. Dalam pembangunan web, HTML ialah bahasa penanda biasa, dan pengesahan teg HTML ialah kaedah yang sangat penting untuk pengesahan borang web. Artikel ini akan memperkenalkan kaedah pengesahan teg HTML asas dan cara menggunakan ungkapan biasa PHP untuk pengesahan. 1. Struktur asas tag HTML Tag HTML terdiri daripada nama elemen dan atribut yang dikelilingi oleh kurungan sudut Tag biasa termasuk p, a, div

Koleksi lengkap tag HTML Koleksi lengkap tag HTML Nov 27, 2023 am 10:05 AM

HTML标签有<!DOCTYPE>、<html>、<head>、<tajuk>、<meta>、<pautan>、<style>、<skrip>、<body>、<h1> - <h6>、<p >、<a>、<img>、<div>、<span>、<input>、<butang>、<borang

See all articles