Re: [請益] 分割utf-8字串的問題
※ 引述《knives ()》之銘言:
: 我上網找到一個分割utf-8字串的function
: 可是問題是如果遇到分割字串長度的最後幾個字是像空格
: 或是有html Tag的符號,要怎麼迴避呢
剛才翻了一下 php.net
http://us3.php.net/manual/en/function.substr.php
我想這個function 應該就是你要的了~
再搭配 htmlentities_decode 應該測一下就有了 :)
erez at meezoog dot com
07-Jul-2009 04:59
An improvement to substrws - multi-byte, and closes tags better.
/**
* word-sensitive substring function with html tags awareness
* @param text The text to cuth
* @param len The maximum length of the cut string
* @returns string
function mb_substrws( $text, $len=180 ) {
....
}
小弟是有實作過,不過大概分享一下能跑但滿弱的作法給你參考參考
敝人存入db的內容都是經過 htmlspecialchars 過後的內容
1.取出 db
例: >b<羽山>/b<:你好 >div<....
2.反解回原始資訊
例: <b>羽山</b>:你好 <div><b>殺人嘍,打cs嘍</b></div>
3.我寫了個很鳥的拆解法(正規表示式),把所有 tags 外的內容放入很大的array
$mStrings[0]="羽山";
$mStrings[1]=":你好";
$mStrings[2]="殺人嘍,打cs嘍";
除此之外,我把原來的那個資訊,變成了範本檔...
$map_key="3WA問題解決專家CodeS[".time()."]3WA問題解決專家CodeEnd";
<b>{$map_key}</b>{$map_key}<div><b>{$map_key}</b></div>
4.然後~你需要限制字數了
mb_internation...(設 UTF-8);
$max_words=200; //最大字數限制
$words_step=0; //一步一步檢查字數是否超過
$is_overflow=false; //爆字數的旗標
$first_overflow=-1; //用來找出第一次爆字數的位置
for($i=0 , $max = count($mStrings); $i < $max; $i++){
if($is_overflow==false){
for($j=0;$j<mb_strlen($mStrings[$i]);$j++){
if($max_words>$words_step){
$words_step++;
}
else{
//爆字數的旗標改成true
//代表超過最大字數限制了,把當下以後的 $mStrings 全清空
//把目前走到的字數之後的字取代為 '.'
}
}//for 迴圈的結束
}else{
// 爆字數了,清空$mStrings[$i]
// 如果 $first_overflow 的值是 -1 ,就寫入目前的 $i
if($first_overflow==-1) $first_overflow=$i;
}//if 的結束
}
本來不太想寫code,但還是寫了..
總之,你會得到已被切掉字的陣列
$mStrings[0]="羽山";
$mStrings[1]=":你好";
$mStrings[2]="殺人嘍,打cs嘍";
$mStrings[3]="學妹:羽山,我下面已經...";
$mStrings[4]="";
$mStrings[5]="";
..
.
.
5.接下來,你只需要再把這個array,弄回原本的位置
$haskeywords_contents="
<b>{$map_key}</b>{$map_key}<div><b>{$map_key}</b></div>...
";
應該是不難,一個迴圈+組合,應該可以很輕易的作出來
$mContent_explode=explode($map_key,$haskeywords_contents);
$finalcontent="";
for($i=0 , $max = count($mContent_explode); $i < $max; $i++)
{
$finalcontent.=$mContent_explode[$i].$mStrings[0];
//如此一來,就又把值接上去了
//然後,檢查剛才第一次發現超過字數的位置 $first_overflow
//看是否要 多一次空的內容應該都可以,就break出來
}
提外話:如果你要用 sprinf 去組應該也是可以啦~
6.接下你應該會發現,你的本文格式最後有點殘缺,
少個</div>還是少個
</td></tr></table>
的嚴重缺失~
不過...應該可以用 tidy什麼replace,把你的 $finalcontent 給補完~
我自己的想法是如此啦,有點嘍嗦~
應該是可以work,只是爛爛的~參考看看 ^^
--
3WA訓練家的工作室
宗旨:諸葛單中,謝謝
個人佈弱格 網址:http://3wa.tw
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.183.142
※ 編輯: shadowjohn 來自: 220.136.183.142 (12/24 00:43)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章
0
18