PHP實現HTML標籤自動補全代碼_其它綜合

來源:互聯網
上載者:User
一般情況下先用PHP的 strip_tags 函數去掉所有html標籤,再去掉空格等,然後再用substr或者自己實現的cn_substr函數來實現截取。因為如果不先去掉html標籤,直接截取出來的字串就會有沒有閉合的標籤出現,有時甚至會截取在標籤上面比如
複製代碼 代碼如下:
</di ...

今天遇到一個內容翻頁截取問題: 本文是用富文字編輯器寫入的,編輯器上有個分頁按鈕,點擊之後就往當前游標位置插入一個藍色的

複製代碼 代碼如下:
<hr />

橫線。然後php直接存入資料庫。顯示的時候,用 explode 函數根據這個

複製代碼 代碼如下:
<hr />

標記來分成一個數組,然後根據當前頁碼來顯示某個片段。 但是有個嚴重的問題,比如富文字編輯器寫入:

複製代碼 代碼如下:

<div style="text-align:center">
content of page 1
<hr />
page 2 content
</div>

如果用explode函數分開後,
第一頁的內容是

複製代碼 代碼如下:

<div style="text-align:center">

content of page 1
第二頁的內容是:

複製代碼 代碼如下:

page 2 content
</div>

這樣就產生了沒有閉合的標籤,直接顯示到頁面上面就會破壞頁面配置。。。
想了很久,也找了網上很多 closetag函數。但是發現都針對第一頁那種沒有閉合的標籤的閉合。對於第二種沒有開頭的標籤就沒辦法了。

針對第一頁那種沒有閉合的標籤的閉合的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];
// 計算關閉開啟標籤數量,如果相同就返回html資料
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
// 把排序數組,將最後一個開啟的標籤放在最前面
$openedtags = array_reverse($openedtags);
// 遍曆開啟標籤數組
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,寫入的內容和得到的內容是不一樣的噢。如果寫入不完整的html片段,瀏覽器會自動補全修正。讀取出來的時候就已經是完整的html dom 片段了。
可是這樣有個弊端,由於是Js載入內容資訊的,會對搜尋引擎最佳化不好。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.