PHP實(shí)現(xiàn)HTML標(biāo)簽自動(dòng)補(bǔ)全代碼
今天遇到一個(gè)內(nèi)容翻頁(yè)截取問(wèn)題: 正文是用富文本編輯器寫入的,編輯器上有個(gè)分頁(yè)按鈕,點(diǎn)擊之后就往當(dāng)前光標(biāo)位置插入一個(gè)藍(lán)色的
橫線。然后php直接存入數(shù)據(jù)庫(kù)。顯示的時(shí)候,用 explode 函數(shù)根據(jù)這個(gè)
標(biāo)記來(lái)分成一個(gè)數(shù)組,然后根據(jù)當(dāng)前頁(yè)碼來(lái)顯示某個(gè)片段。 但是有個(gè)嚴(yán)重的問(wèn)題,比如富文本編輯器寫入:
<div style="text-align:center">
content of page 1
<hr />
page 2 content
</div>
如果用explode函數(shù)分開(kāi)后,
第一頁(yè)的內(nèi)容是
<div style="text-align:center">
content of page 1
第二頁(yè)的內(nèi)容是:
page 2 content
</div>
這樣就產(chǎn)生了沒(méi)有閉合的標(biāo)簽,直接顯示到頁(yè)面上面就會(huì)破壞頁(yè)面布局。。。
想了很久,也找了網(wǎng)上很多 closetag函數(shù)。但是發(fā)現(xiàn)都針對(duì)第一頁(yè)那種沒(méi)有閉合的標(biāo)簽的閉合。對(duì)于第二種沒(méi)有開(kāi)頭的標(biāo)簽就沒(méi)辦法了。
針對(duì)第一頁(yè)那種沒(méi)有閉合的標(biāo)簽的閉合的closetags方法是:
function closetags($html) {
// 不需要補(bǔ)全的標(biāo)簽
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');
// 匹配開(kāi)始標(biāo)簽
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
// 匹配關(guān)閉標(biāo)簽
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
// 計(jì)算關(guān)閉開(kāi)啟標(biāo)簽數(shù)量,如果相同就返回html數(shù)據(jù)
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
// 把排序數(shù)組,將最后一個(gè)開(kāi)啟的標(biāo)簽放在最前面
$openedtags = array_reverse($openedtags);
// 遍歷開(kāi)啟標(biāo)簽數(shù)組
for ($i = 0; $i < $len_opened; $i++) {
// 如果需要補(bǔ)全的標(biāo)簽
if (!in_array($openedtags[$i], $arr_single_tags)) {
// 如果這個(gè)標(biāo)簽不在關(guān)閉的標(biāo)簽中
if (!in_array($openedtags[$i], $closedtags)) {
// 直接補(bǔ)全閉合標(biāo)簽
$html .= '</' . $openedtags[$i] . '>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
后來(lái)想了一個(gè)辦法,利用瀏覽器自己的html解釋引擎來(lái)幫助補(bǔ)全有問(wèn)題的html片段。具體做法如下:
<script>
var div = document.createElement('div');
div.innerHTML ='<?php echo ("<div>這里是被截取的html片段");?>';
document.write(div.innerHTML);
</script>
原理就是先把html片段寫入到一個(gè)空的div里面,然后再?gòu)倪@個(gè)div里面讀取出來(lái)。別看寫入和讀取的屬性都是innerHTML,寫入的內(nèi)容和得到的內(nèi)容是不一樣的噢。如果寫入不完整的html片段,瀏覽器會(huì)自動(dòng)補(bǔ)全修正。讀取出來(lái)的時(shí)候就已經(jīng)是完整的html dom 片段了。
可是這樣有個(gè)弊端,由于是Js加載內(nèi)容信息的,會(huì)對(duì)搜索引擎優(yōu)化不好。
- php截取html字符串及自動(dòng)補(bǔ)全html標(biāo)簽的方法
- php使HTML標(biāo)簽自動(dòng)補(bǔ)全閉合函數(shù)代碼
- PHP正則表達(dá)式過(guò)濾html標(biāo)簽屬性(DEMO)
- PHP實(shí)現(xiàn)過(guò)濾各種HTML標(biāo)簽
- php過(guò)濾表單提交的html等危險(xiǎn)代碼
- php過(guò)濾HTML標(biāo)簽、屬性等正則表達(dá)式匯總
- 淺析php過(guò)濾html字符串,防止SQL注入的方法
- php正則過(guò)濾html標(biāo)簽、空格、換行符的代碼(附說(shuō)明)
- php 正則 過(guò)濾html 的超鏈接
- php完全過(guò)濾HTML,JS,CSS等標(biāo)簽
- PHP實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容html標(biāo)簽補(bǔ)全和過(guò)濾的方法小結(jié)【2種方法】
相關(guān)文章
unicode utf-8 gb18030 gb2312 gbk各種編碼對(duì)比
在修改一個(gè)cms的過(guò)程當(dāng)中遇到一個(gè)php截取字符串的函數(shù)(當(dāng)然得兼容中英字符了),因?yàn)閷?duì)各種編碼的字符范圍和字符表示不清楚,感覺(jué)一頭迷霧,雖然可以直接來(lái)調(diào)用這個(gè)函數(shù)2009-05-05偽靜態(tài)技術(shù)介紹與優(yōu)缺點(diǎn)分析(較完整篇)
偽靜態(tài)太適合用在普通的企業(yè)網(wǎng)站上了——既不要求高并發(fā),但同時(shí)又很在乎seo(搜索引擎優(yōu)化),而且也要求后臺(tái)可動(dòng)態(tài)更新。2009-11-11計(jì)算機(jī)程序設(shè)計(jì)并行計(jì)算概念及定義全面詳解
最近項(xiàng)目需要實(shí)現(xiàn)程序的并行化,剛好借著翻譯這篇帖子的機(jī)會(huì),了解和熟悉并行計(jì)算的基本概念和程序設(shè)計(jì),有需要的朋友可以借鑒參考下2021-11-11Caffe圖像數(shù)據(jù)轉(zhuǎn)換成可運(yùn)行l(wèi)eveldb?lmdb文件
這篇文章主要為大家介紹了Caffe圖像數(shù)據(jù)轉(zhuǎn)換成可運(yùn)行l(wèi)eveldb?lmdb文件教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06使用MobaXterm連接到遠(yuǎn)程服務(wù)器的圖文教程
這篇文章主要為大家詳細(xì)為大家介紹了如何使用MobaXterm連接到遠(yuǎn)程服務(wù)器,文中通過(guò)圖文進(jìn)行了詳細(xì)的講解,有需要的小伙伴可以參考一下2023-09-09Trie樹(shù)_字典樹(shù)(字符串排序)簡(jiǎn)介及實(shí)現(xiàn)
有時(shí),我們會(huì)碰到對(duì)字符串的排序,若采用一些經(jīng)典的排序算法,則時(shí)間復(fù)雜度一般為O(n*lgn),但若采用Trie樹(shù),則時(shí)間復(fù)雜度僅為O(n)2014-03-03VsCode運(yùn)行html界面的實(shí)戰(zhàn)步驟
在VSCode中默認(rèn)編寫的HTML頁(yè)面是不能運(yùn)行的,下面這篇文章主要給大家介紹了關(guān)于VsCode運(yùn)行html界面的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10阿里巴巴開(kāi)源 Dragonwell JDK 最新版本 8.1.1-GA 發(fā)布
距離 Dragonwell JDK 第一個(gè)正式版本 8.0.0-GA 發(fā)布已經(jīng)過(guò)去 3 個(gè)月了,項(xiàng)目在 Github 上的 stars 繼續(xù)攀升達(dá)到了 1900。今天我們帶來(lái)了最新版本 8.1.1-GA 的發(fā)布,包含了全新的特性和更新,需要的朋友可以參考下2019-10-10