而且給的資料是HTML程式碼字串,例如這樣:
截取的時候是要截取div 標籤內部的東西,而且要保留HTML標籤,只是對其中的文字做處理。例如我可能只是截取到「李四」的「李」字,但是如果就這樣放到前端的話,「李四」前面的 a 標籤是沒有閉合的,所以截取之後要保證HTML的語法正確。
這個問題確實不太好搞,讓我鬱悶了兩天。請注意,這只是一個字串,只不過內容是HTML程式碼,是沒有什麼DOM的。如果在前端處理就好辦了,直接DOM獲取,然後對裡面的節點進行處理,最後把innerHTML 之類的東西輸出就搞定了。現在可不行了,得換個思路。同事的思路是這樣的:
遍歷字串的每一個字元。設定一個標記,碰到標籤開始的標記之後再開始計數。對標籤內部的字串處理的時候,還要先判斷目前字元的編碼是不是可能是中文,一般來說PHP中UTF-8 編碼的中文字元的長度都是3,所以如果碰到是中文字元編碼,就要跳過兩個不記數……說到這裡我自己頭已經開始大了。個人認為這種方法很不爽,首先這種精緻的邏輯不太容易控制,而且 UFT-8 編碼下中文產生的長度有可能是3個或4個 所以代碼的嚴密性值得懷疑。
我個人的思路是,用 Tidy 來搞(具體用法請看PHP手冊吧)。昨天研究了一下那個 Tidy ,發現這個東西還挺好用的。首先,把這個字串轉換成Tidy 對象,這樣:
$tidy = tidy_parse_string($str, array(), 'utf8′); // 最後一個是設定編碼的,注意,這裡是utf8 ,不是utf- 8,沒有中間那個連線。
然後取得$tidy中的body(因為轉換之後$tidy會自動加上
等標籤):$body = tidy_get_body($tidy);
這個時候你可以用var_dump 看一些$body 的結構,會發現它把每個標籤都變成了一個對應的對象,裡面有對應的屬性。舉例來說,例如sdf ,這麼一條語句對應的一些屬性有:
name=>”a”
value => “sdf ”
child=> array{[0]=>一個文本節點對象,value是sdf}
attribute=array{”href”=>”#”}
…..其他屬性
可以看到,我們其實是可以單獨去處理a 標籤對應節點下面的文字節點的值的,這樣就不會破壞任何HTML完整性。原來我以為改變a 標籤中文字節點的值之後, a 標籤的value也會跟著改變,那樣我直接返回a標籤對應節點的value就OK了,沒想到不是那個樣子,哎,所以處理過其中的文字之後還是要自己拼出新的HTML。
知道了Tidy物件的結構之後,一切就好辦了,只要遍歷所有的節點,對於本需求來說,就是找到那個 div 標籤,然後開始處理裡面的節點。程式碼如下:
if(mb_strwidth($subchild->value, 'utf-8′) >= $len)
{
$subchild->value = mb_strimwidth($subchild->value, 0, $len, '… ', 'utf-8′);
$trimed_str .= $subchild->value;
break;
}
else
{
$trimed_str .= $subchild->value;$
$len = $len - subchild->value, 'utf-8′);
}
裡面的$subchild 就是一個子節點。注意,這裡使用了 mb_strwidth 來取得字串長度。嚴重推薦這個 mb_strwidth,很好用,它會把中文當作兩個字元長度處理,正好符合這裡的需求!而且截取字串的時候用到了 mb_strimwidth,這個函數也會把中文當作兩個字元長度處理,mb_ 開頭的函數真是好用啊。
具體程式碼我就不寫出來了,因為是針對一個需求寫的,沒做成通用的形式。哪天我有時間做成通用的再發布一下。
另外,可惜FireFox不支援 text-overflow 屬性,不然也不用後台那麼辛苦地去截斷了。如果大家有更好的方法,可以留言討論,更多相關文章請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能