產生摘要
最近需要加一個需求,有一個send_article的接口,需要從html代碼裡提取出來中文字符,變成摘要,先後試了很多方法,比如:
<code><span>//匹配中文utf8编码</span><span><span>function</span><span>utf8_summary</span><span>(<span>$article</span>)</span> {</span><span>$match</span> = <span>"/^[\x{4e00}-\x{9fa5}]+$/u"</span>;<span>//正则表达式,匹配中文</span> preg_match_all(<span>$match</span>,<span>$article</span>,<span>$temp</span>); <span>$summary</span> = <span>""</span>; <span>foreach</span> (<span>$temp</span><span>as</span><span>$key</span> => <span>$value</span>) { <span>$sum</span> = implode(<span>''</span> , <span>$value</span>); <span>$summary</span> = <span>$sumary</span> . <span>$sum</span>; }<span>//将中文拼接起来</span><span>return</span><span>$summary</span>; } </code>
問題為:
1.當出現連續的中文時,會出現無法取出的情況
2.當出現中文與字元混排時,此方法有效
原因:
可能當純中文時,會使編碼改變為其他的,所以正則表達式無法匹配,但是當出現有中文與字符混排時,字符編碼為utf8,所以可以匹配,其實客戶端可以將中文包裹在標籤裡,並加入head頭,使用setchars=utf8來指明,但是客戶端的實體類別已經寫好,改動太麻煩,只有後台想辦法,於是嘗試了第二個辦法:
<code><span>$function</span> url_summary(<span>$article</span>) { <span>$article</span> = urlencode(); <span>$match</span> = <span>"/^%[a-zA-Z0-9]{2}/"</span>; preg_match_all(<span>$match</span>,<span>$article</span>,<span>$temp</span>); <span>$summary</span> = <span>""</span>; <span>foreach</span> (<span>$temp</span><span>as</span><span>$key</span> => <span>$value</span>) { <span>$sum</span> = implode(<span>''</span> , <span>$value</span>); <span>$summary</span> = <span>$sumary</span> . <span>$sum</span>; } <span>$summary</span> = decode(<span>$summary</span>); <span>return</span><span>$summary</span>; }</code>
該方法的思路是:觀察到當非字母與數字經過url編碼以後,會變成類似%e7的字串,所以是取出這些,再把這些字串拼接起來,在解碼,會得到中文。
後來發現:其實是一個函數的事兒
發現有一個函數,可以改變編碼
<code><span>iconv(<span>"gbk"</span>,<span>"utf-8"</span>,<span>"php中文转码"</span>)</span>;<span>//把中文gbk编码转为utf8</span><span>iconv(<span>"utf-8"</span>,<span>"gbk"</span>,<span>"php中文转码"</span>)</span>;<span>//把中文utf8编码转为gbk</span></code>
但是該函數,要使用的話,需要到php.ini檔案中去把extension=php_iconv.dll這一項打開,並且安裝iconv函數庫才可以使用
,比較麻煩。
最後發現,使用strip_tags()函數可以解決
此函數可以移除html標籤,然後截取一段即可,
mb_substr(summary,0,50);//截取一段字元
且需要移除轉義字符,如 ;
str_replace(’ ’,‘’,
即可產生摘要,後期可以加入更多功能,例如斷句,換行;