Re: [請益] 分割utf-8字串的問題

看板PHP作者 (3WA問題解決專家)時間16年前 (2009/12/24 00:33), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《knives ()》之銘言: : 我上網找到一個分割utf-8字串的function : 可是問題是如果遇到分割字串長度的最後幾個字是像空格&nbsp; : 或是有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 例: &gt;b&lt;羽山&gt;/b&lt;:你好&nbsp;&gt;div&lt;.... 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)
文章代碼(AID): #1BCaOyX3 (PHP)
討論串 (同標題文章)
文章代碼(AID): #1BCaOyX3 (PHP)