PHP實現(xiàn)HTML標簽自動補全代碼
更新時間:2012年10月04日 18:32:17 作者:
開發(fā)各種項目中經(jīng)常遇到截取html字符串問題。 比如博客文章列表頁面截取一部分正文、文章正文翻頁截取等
一般情況下先用PHP的 strip_tags 函數(shù)去掉所有html標簽,再去掉空格等,然后再用substr或者自己實現(xiàn)的cn_substr函數(shù)來實現(xiàn)截取。因為如果不先去掉html標簽,直接截取出來的字符串就會有沒有閉合的標簽出現(xiàn),有時甚至會截取在標簽上面比如
今天遇到一個內(nèi)容翻頁截取問題: 正文是用富文本編輯器寫入的,編輯器上有個分頁按鈕,點擊之后就往當前光標位置插入一個藍色的
橫線。然后php直接存入數(shù)據(jù)庫。顯示的時候,用 explode 函數(shù)根據(jù)這個
標記來分成一個數(shù)組,然后根據(jù)當前頁碼來顯示某個片段。 但是有個嚴重的問題,比如富文本編輯器寫入:
<div style="text-align:center">
content of page 1
<hr />
page 2 content
</div>
如果用explode函數(shù)分開后,
第一頁的內(nèi)容是
<div style="text-align:center">
content of page 1
第二頁的內(nèi)容是:
page 2 content
</div>
這樣就產(chǎn)生了沒有閉合的標簽,直接顯示到頁面上面就會破壞頁面布局。。。
想了很久,也找了網(wǎng)上很多 closetag函數(shù)。但是發(fā)現(xiàn)都針對第一頁那種沒有閉合的標簽的閉合。對于第二種沒有開頭的標簽就沒辦法了。
針對第一頁那種沒有閉合的標簽的閉合的closetags方法是:
function closetags($html) {
// 不需要補全的標簽
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');
// 匹配開始標簽
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
// 匹配關閉標簽
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
// 計算關閉開啟標簽數(shù)量,如果相同就返回html數(shù)據(jù)
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
// 把排序數(shù)組,將最后一個開啟的標簽放在最前面
$openedtags = array_reverse($openedtags);
// 遍歷開啟標簽數(shù)組
for ($i = 0; $i < $len_opened; $i++) {
// 如果需要補全的標簽
if (!in_array($openedtags[$i], $arr_single_tags)) {
// 如果這個標簽不在關閉的標簽中
if (!in_array($openedtags[$i], $closedtags)) {
// 直接補全閉合標簽
$html .= '</' . $openedtags[$i] . '>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
后來想了一個辦法,利用瀏覽器自己的html解釋引擎來幫助補全有問題的html片段。具體做法如下:
<script>
var div = document.createElement('div');
div.innerHTML ='<?php echo ("<div>這里是被截取的html片段");?>';
document.write(div.innerHTML);
</script>
原理就是先把html片段寫入到一個空的div里面,然后再從這個div里面讀取出來。別看寫入和讀取的屬性都是innerHTML,寫入的內(nèi)容和得到的內(nèi)容是不一樣的噢。如果寫入不完整的html片段,瀏覽器會自動補全修正。讀取出來的時候就已經(jīng)是完整的html dom 片段了。
可是這樣有個弊端,由于是Js加載內(nèi)容信息的,會對搜索引擎優(yōu)化不好。
復制代碼 代碼如下:
</di ...
今天遇到一個內(nèi)容翻頁截取問題: 正文是用富文本編輯器寫入的,編輯器上有個分頁按鈕,點擊之后就往當前光標位置插入一個藍色的
復制代碼 代碼如下:
<hr />
橫線。然后php直接存入數(shù)據(jù)庫。顯示的時候,用 explode 函數(shù)根據(jù)這個
復制代碼 代碼如下:
<hr />
標記來分成一個數(shù)組,然后根據(jù)當前頁碼來顯示某個片段。 但是有個嚴重的問題,比如富文本編輯器寫入:
復制代碼 代碼如下:
<div style="text-align:center">
content of page 1
<hr />
page 2 content
</div>
如果用explode函數(shù)分開后,
第一頁的內(nèi)容是
復制代碼 代碼如下:
<div style="text-align:center">
content of page 1
第二頁的內(nèi)容是:
復制代碼 代碼如下:
page 2 content
</div>
這樣就產(chǎn)生了沒有閉合的標簽,直接顯示到頁面上面就會破壞頁面布局。。。
想了很久,也找了網(wǎng)上很多 closetag函數(shù)。但是發(fā)現(xiàn)都針對第一頁那種沒有閉合的標簽的閉合。對于第二種沒有開頭的標簽就沒辦法了。
針對第一頁那種沒有閉合的標簽的閉合的closetags方法是:
復制代碼 代碼如下:
function closetags($html) {
// 不需要補全的標簽
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');
// 匹配開始標簽
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
// 匹配關閉標簽
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
// 計算關閉開啟標簽數(shù)量,如果相同就返回html數(shù)據(jù)
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
// 把排序數(shù)組,將最后一個開啟的標簽放在最前面
$openedtags = array_reverse($openedtags);
// 遍歷開啟標簽數(shù)組
for ($i = 0; $i < $len_opened; $i++) {
// 如果需要補全的標簽
if (!in_array($openedtags[$i], $arr_single_tags)) {
// 如果這個標簽不在關閉的標簽中
if (!in_array($openedtags[$i], $closedtags)) {
// 直接補全閉合標簽
$html .= '</' . $openedtags[$i] . '>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
后來想了一個辦法,利用瀏覽器自己的html解釋引擎來幫助補全有問題的html片段。具體做法如下:
復制代碼 代碼如下:
<script>
var div = document.createElement('div');
div.innerHTML ='<?php echo ("<div>這里是被截取的html片段");?>';
document.write(div.innerHTML);
</script>
原理就是先把html片段寫入到一個空的div里面,然后再從這個div里面讀取出來。別看寫入和讀取的屬性都是innerHTML,寫入的內(nèi)容和得到的內(nèi)容是不一樣的噢。如果寫入不完整的html片段,瀏覽器會自動補全修正。讀取出來的時候就已經(jīng)是完整的html dom 片段了。
可是這樣有個弊端,由于是Js加載內(nèi)容信息的,會對搜索引擎優(yōu)化不好。
相關文章
unicode utf-8 gb18030 gb2312 gbk各種編碼對比
在修改一個cms的過程當中遇到一個php截取字符串的函數(shù)(當然得兼容中英字符了),因為對各種編碼的字符范圍和字符表示不清楚,感覺一頭迷霧,雖然可以直接來調(diào)用這個函數(shù)2009-05-05Caffe圖像數(shù)據(jù)轉(zhuǎn)換成可運行l(wèi)eveldb?lmdb文件
這篇文章主要為大家介紹了Caffe圖像數(shù)據(jù)轉(zhuǎn)換成可運行l(wèi)eveldb?lmdb文件教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06阿里巴巴開源 Dragonwell JDK 最新版本 8.1.1-GA 發(fā)布
距離 Dragonwell JDK 第一個正式版本 8.0.0-GA 發(fā)布已經(jīng)過去 3 個月了,項目在 Github 上的 stars 繼續(xù)攀升達到了 1900。今天我們帶來了最新版本 8.1.1-GA 的發(fā)布,包含了全新的特性和更新,需要的朋友可以參考下2019-10-10