可以保證單詞完整性的PHP英文字符串截取代碼分享
直接上代碼:
/**
* 完整詞的截取
*
* @param $str
* @param $start
* @param $length
*
* @return string
*/
public static function usubstr($str, $start, $length = null)
{
// 先正常截取一遍.
$res = substr($str, $start, $length);
$strlen = strlen($str);
/* 接著判斷頭尾各6字節(jié)是否完整(不殘缺) */
// 如果參數(shù)start是正數(shù)
if ($start >= 0) {
// 往前再截取大約6字節(jié)
$next_start = $start + $length; // 初始位置
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
$next_segm = substr($str, $next_start, $next_len);
// 如果第1字節(jié)就不是 完整字符的首字節(jié), 再往后截取大約6字節(jié)
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr($str, $prev_start, $start - $prev_start);
} // start是負(fù)數(shù)
else {
// 往前再截取大約6字節(jié)
$next_start = $strlen + $start + $length; // 初始位置
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
$next_segm = substr($str, $next_start, $next_len);
// 如果第1字節(jié)就不是 完整字符的首字節(jié), 再往后截取大約6字節(jié).
$start = $strlen + $start;
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr($str, $prev_start, $start - $prev_start);
}
// 判斷前6字節(jié)是否符合utf8規(guī)則
if (preg_match('@^([x80-xBF]{0,5})[xC0-xFD]?@', $next_segm, $bytes)) {
if (!empty($bytes[1])) {
$bytes = $bytes[1];
$res .= $bytes;
}
}
// 判斷后6字節(jié)是否符合utf8規(guī)則
$ord0 = ord($res[0]);
if (128 <= $ord0 && 191 >= $ord0) {
// 往后截取 , 并加在res的前面.
if (preg_match('@[xC0-xFD][x80-xBF]{0,5}$@', $prev_segm, $bytes)) {
if (!empty($bytes[0])) {
$bytes = $bytes[0];
$res = $bytes . $res;
}
}
}
if (strlen($res) < $strlen) {
$res = $res . '...';
}
return $res;
}
相關(guān)文章
php中關(guān)于socket的系列函數(shù)總結(jié)
這篇文章主要介紹了php中關(guān)于socket的系列函數(shù)總結(jié),本文列舉了所有關(guān)于PHP語(yǔ)言中使用socket相關(guān)服務(wù)的一些函數(shù),需要的朋友可以參考下2015-05-05
laravel按天、按小時(shí),查詢數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇laravel按天、按小時(shí),查詢數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
LaravelS通過(guò)Swoole加速Laravel/Lumen詳解
這篇文章主要給大家介紹了關(guān)于LaravelS通過(guò)Swoole加速Laravel/Lumen的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
ThinkPHP2.0讀取MSSQL提示Incorrect syntax near the keyword ''AS''
這篇文章主要介紹了ThinkPHP2.0讀取MSSQL提示Incorrect syntax near the keyword 'AS'的解決方法,需要的朋友可以參考下2014-06-06
淺談laravel數(shù)據(jù)庫(kù)查詢返回的數(shù)據(jù)形式
今天小編就為大家分享一篇淺談laravel數(shù)據(jù)庫(kù)查詢返回的數(shù)據(jù)形式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
微信營(yíng)銷(xiāo)平臺(tái)系統(tǒng)–刮刮樂(lè)的開(kāi)發(fā)
最近一直在做微信相關(guān)的開(kāi)發(fā)工作,刮刮樂(lè)是一個(gè)最常見(jiàn)的微信應(yīng)用了,網(wǎng)上也有很多的教程,本來(lái)是不想寫(xiě)這篇博文的,但又怕網(wǎng)友被坑,我還是寫(xiě)一下。2014-06-06
Laravel創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)的例子
今天小編就為大家分享一篇Laravel創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
php文件服務(wù)實(shí)現(xiàn)虛擬掛載其他目錄示例
這篇文章主要介紹了php文件服務(wù)實(shí)現(xiàn)虛擬掛載其他目錄示例,需要的朋友可以參考下2014-04-04
PHP getallheaders無(wú)法獲取自定義頭(headers)的問(wèn)題
這篇文章主要介紹了PHP getallheaders無(wú)法獲取自定義頭(headers)的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2016-03-03

