最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP 修復(fù)未正常關(guān)閉的HTML標(biāo)簽實現(xiàn)代碼(支持嵌套和就近閉合)

 更新時間:2012年06月07日 13:43:15   作者:  
PHP 修復(fù)未正常關(guān)閉的 HTML 標(biāo)簽 支持嵌套和就近閉合,需要的朋友可以參考下
fixHtmlTag
version 0.2
這個版本解決了上次遺留的問題,即就近閉合和嵌套閉合問題。具體可以看代碼的注釋。
復(fù)制代碼 代碼如下:

<?php

/**
* fixHtmlTag
*
* HTML標(biāo)簽修復(fù)函數(shù),此函數(shù)可以修復(fù)未正確閉合的 HTML 標(biāo)簽
*
* 由于不確定性因素太多,暫時提供兩種模式“嵌套閉合模式”和
* “就近閉合模式”,應(yīng)該夠用了。
*
* 這兩種模式是我為了解釋清楚此函數(shù)的實現(xiàn)而創(chuàng)造的兩個名詞,
* 只需明白什么意思就行。
* 1,嵌套閉合模式,NEST,為默認(rèn)的閉合方式。即 "<body><div>你好"
* 這樣的 html 代碼會被修改為 "<body><div>你好</div></body>"
* 2,就近閉合模式,CLOSE,這種模式會將形如 "<p>你好<p>為什么沒有
* 閉合呢" 的代碼修改為 "<p>你好</p><p>為什么沒有閉合呢</p>"
*
* 在嵌套閉合模式(默認(rèn),無需特殊傳參)下,可以傳入需要就近閉合的
* 標(biāo)簽名,通過這種方式將類似 "<body><p>你好</p><p>我也好" 轉(zhuǎn)換為
* "<body><p>你好</p><p>我也好</p></body>"的形式。
* 傳參時索引需要按照如下方式寫,不需要修改的設(shè)置可以省略
*
* $param = array(
* 'html' => '', //必填
* 'options' => array(
* 'tagArray' => array();
* 'type' => 'NEST',
* 'length' => null,
* 'lowerTag' => TRUE,
* 'XHtmlFix' => TRUE,
* )
* );
* fixHtmlTag($param);
*
* 上面索引對應(yīng)的值含義如下
* string $html 需要修改的 html 代碼
* array $tagArray 當(dāng)為嵌套模式時,需要就近閉合的標(biāo)簽數(shù)組
* string $type 模式名,目前支持 NEST 和 CLOSE 兩種模式,如果設(shè)置為 CLOSE,將會忽略參數(shù) $tagArray 的設(shè)置,而全部就近閉合所有標(biāo)簽
* ini $length 如果希望截斷一定長度,可以在此賦值,此長度指的是字符串長度
* bool $lowerTag 是否將代碼中的標(biāo)簽全部轉(zhuǎn)換為小寫,默認(rèn)為 TRUE
* bool $XHtmlFix 是否處理不符合 XHTML 規(guī)范的標(biāo)簽,即將 <br> 轉(zhuǎn)換為 <br />
*
* @author IT不倒翁 <itbudaoweng@gmail.com>
* @version 0.2
* @link http://yungbo.com IT不倒翁
* @link http://enenba.com/?post=19 某某
* @param array $param 數(shù)組參數(shù),需要賦予特定的索引
* @return string $result 經(jīng)過處理后的 html 代碼
* @since 2012-04-14
*/
function fixHtmlTag($param = array()) {
//參數(shù)的默認(rèn)值
$html = '';
$tagArray = array();
$type = 'NEST';
$length = null;
$lowerTag = TRUE;
$XHtmlFix = TRUE;

//首先獲取一維數(shù)組,即 $html 和 $options (如果提供了參數(shù))
extract($param);

//如果存在 options,提取相關(guān)變量
if (isset($options)) {
extract($options);
}

$result = ''; //最終要返回的 html 代碼
$tagStack = array(); //標(biāo)簽棧,用 array_push() 和 array_pop() 模擬實現(xiàn)
$contents = array(); //用來存放 html 標(biāo)簽
$len = 0; //字符串的初始長度

//設(shè)置閉合標(biāo)記 $isClosed,默認(rèn)為 TRUE, 如果需要就近閉合,成功匹配開始標(biāo)簽后其值為 false,成功閉合后為 true
$isClosed = true;

//將要處理的標(biāo)簽全部轉(zhuǎn)為小寫
$tagArray = array_map('strtolower', $tagArray);

//“合法”的單閉合標(biāo)簽
$singleTagArray = array(
'<meta',
'<link',
'<base',
'<br',
'<hr',
'<input',
'<img'
);

//校驗匹配模式 $type,默認(rèn)為 NEST 模式
$type = strtoupper($type);
if (!in_array($type, array('NEST', 'CLOSE'))) {
$type = 'NEST';
}

//以一對 < 和 > 為分隔符,將原 html 標(biāo)簽和標(biāo)簽內(nèi)的字符串放到數(shù)組中
$contents = preg_split("/(<[^>]+?>)/si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

foreach ($contents as $tag) {
if ('' == trim($tag)) {
$result .= $tag;
continue;
}

//匹配標(biāo)準(zhǔn)的單閉合標(biāo)簽,如<br />
if (preg_match("/<(\w+)[^\/>]*?\/>/si", $tag)) {
$result .= $tag;
continue;
}

//匹配開始標(biāo)簽,如果是單標(biāo)簽則出棧
else if (preg_match("/<(\w+)[^\/>]*?>/si", $tag, $match)) {
//如果上一個標(biāo)簽沒有閉合,并且上一個標(biāo)簽屬于就近閉合類型
//則閉合之,上一個標(biāo)簽出棧

//如果標(biāo)簽未閉合
if (false === $isClosed) {
//就近閉合模式,直接就近閉合所有的標(biāo)簽
if ('CLOSE' == $type) {
$result .= '</' . end($tagStack) . '>';
array_pop($tagStack);
}
//默認(rèn)的嵌套模式,就近閉合參數(shù)提供的標(biāo)簽
else {
if (in_array(end($tagStack), $tagArray)) {
$result .= '</' . end($tagStack) . '>';
array_pop($tagStack);
}
}
}

//如果參數(shù) $lowerTag 為 TRUE 則將標(biāo)簽名轉(zhuǎn)為小寫
$matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1];

$tag = str_replace('<' . $match[1], '<' . $matchLower, $tag);
//開始新的標(biāo)簽組合
$result .= $tag;
array_push($tagStack, $matchLower);

//如果屬于約定的的單標(biāo)簽,則閉合之并出棧
foreach ($singleTagArray as $singleTag) {
if (stripos($tag, $singleTag) !== false) {
if ($XHtmlFix == TRUE) {
$tag = str_replace('>', ' />', $tag);
}
array_pop($tagStack);
}
}

//就近閉合模式,狀態(tài)變?yōu)槲撮]合
if ('CLOSE' == $type) {
$isClosed = false;
}
//默認(rèn)的嵌套模式,如果標(biāo)簽位于提供的 $tagArray 里,狀態(tài)改為未閉合
else {
if (in_array($matchLower, $tagArray)) {
$isClosed = false;
}
}
unset($matchLower);
}

//匹配閉合標(biāo)簽,如果合適則出棧
else if (preg_match("/<\/(\w+)[^\/>]*?>/si", $tag, $match)) {

//如果參數(shù) $lowerTag 為 TRUE 則將標(biāo)簽名轉(zhuǎn)為小寫
$matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1];

if (end($tagStack) == $matchLower) {
$isClosed = true; //匹配完成,標(biāo)簽閉合
$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;
}
}
}

//如果還有將棧內(nèi)的未閉合的標(biāo)簽連接到 $result
while (!empty($tagStack)) {
$result .= '</' . array_pop($tagStack) . '>';
}
return $result;
}
您可能感興趣的文章:

相關(guān)文章

  • Joomla調(diào)用系統(tǒng)自帶編輯器的實現(xiàn)方法

    Joomla調(diào)用系統(tǒng)自帶編輯器的實現(xiàn)方法

    這篇文章主要介紹了Joomla調(diào)用系統(tǒng)自帶編輯器的實現(xiàn)方法,實例分析了Joomla調(diào)用系統(tǒng)自帶編輯器的具體步驟、相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2016-05-05
  • PHP 實現(xiàn)從數(shù)據(jù)庫導(dǎo)出到.csv文件方法

    PHP 實現(xiàn)從數(shù)據(jù)庫導(dǎo)出到.csv文件方法

    這篇文章主要介紹了 PHP 實現(xiàn)從數(shù)據(jù)庫導(dǎo)出到.csv文件方法的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • PHP使用Redis實現(xiàn)Session共享的實現(xiàn)示例

    PHP使用Redis實現(xiàn)Session共享的實現(xiàn)示例

    這篇文章主要介紹了PHP使用Redis實現(xiàn)Session共享的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 基于php-fpm 參數(shù)的深入理解

    基于php-fpm 參數(shù)的深入理解

    本篇文章是對php-fpm參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP使用array_multisort對多個數(shù)組或多維數(shù)組進(jìn)行排序

    PHP使用array_multisort對多個數(shù)組或多維數(shù)組進(jìn)行排序

    這篇文章主要介紹了PHP使用array_multisort對多個數(shù)組或多維數(shù)組進(jìn)行排序,需要的朋友可以參考下
    2014-12-12
  • php生成靜態(tài)html頁面的方法(2種方法)

    php生成靜態(tài)html頁面的方法(2種方法)

    在PHP網(wǎng)站開發(fā)中為了網(wǎng)站推廣和SEO等需要,需要對網(wǎng)站進(jìn)行全站或局部靜態(tài)化處理,PHP生成靜態(tài)HTML頁面有多種方法,比如利用PHP模板、ob系列的函數(shù),本文給大家分享php生成靜態(tài)html頁面的方法(2種方法),感興趣的朋友跟著小編一起學(xué)習(xí)學(xué)習(xí)吧
    2015-09-09
  • php 輸入輸出流詳解及示例代碼

    php 輸入輸出流詳解及示例代碼

    本文主要介紹php 輸入輸出流,這里整理了相關(guān)資料及簡單示例代碼,有需要的小伙伴可以參考下
    2016-08-08
  • 一篇文章弄懂PHP和HTML的嵌套寫法

    一篇文章弄懂PHP和HTML的嵌套寫法

    雖然HTML標(biāo)簽有很多,并且我們在制作頁面的時候可以無限的嵌套,但是嵌套也有規(guī)則,不能隨意的嵌套,這篇文章主要給大家介紹了如何通過一篇文章弄懂PHP和HTML的嵌套寫法,需要的朋友可以參考下
    2021-07-07
  • PHP-Java-Bridge使用筆記

    PHP-Java-Bridge使用筆記

    這是我在做平安銀行開發(fā)的時候,本地使用PHP環(huán)境,平安銀行接口為Java接口的時候,采用PHP-Java-Bridge的方式調(diào)用接口的筆記。因為現(xiàn)在網(wǎng)上的教程基本上都不行了,所以在這里貼出我能使用的而且目前網(wǎng)上最新的版本(2014-09-19),如果有錯,請通過郵件聯(lián)系,謝謝。
    2014-09-09
  • Yii操作數(shù)據(jù)庫實現(xiàn)動態(tài)獲取表名的方法

    Yii操作數(shù)據(jù)庫實現(xiàn)動態(tài)獲取表名的方法

    這篇文章主要介紹了Yii操作數(shù)據(jù)庫實現(xiàn)動態(tài)獲取表名的方法,涉及Yii框架針對數(shù)據(jù)庫的動態(tài)操作技巧,需要的朋友可以參考下
    2016-03-03

最新評論

西贡区| 探索| 基隆市| 延吉市| 永泰县| 昭通市| 扎囊县| 咸阳市| 昌平区| 油尖旺区| 金昌市| 开江县| 汉源县| 无锡市| 同心县| 海原县| 莒南县| 台州市| 宿迁市| 合水县| 蒲江县| 台湾省| 盈江县| 抚顺县| 绿春县| 武夷山市| 荥经县| 曲麻莱县| 自贡市| 广元市| 溆浦县| 辽中县| 彭山县| 黔西县| 景宁| 石首市| 安顺市| 皋兰县| 拜泉县| 平度市| 武城县|