PHP按照视觉长度截取字符串,电商网站标题截取
由于PHP中utf8编码格式汉字占用3字节,ASCII码值占用1字节,导致切分标题显示效果长短不一,例如
$titles = [ '11111,,11111111111111111111111111111111111111111111111111111', '저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.', 'Я из категории работающих. Я из категории работающих. Я из категории работающих. ', '33333,,33333333333333333333333333333333333333333333333333333', '一二三四五,,六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十', '哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈', ];
用mb_substr切分也是有视觉差距的:
foreach ($titles as $title) { echo mb_substr($title, 0, 10, 'utf-8') .'...'. PHP_EOL; }
自己编写方法处理,首先把字符串按照字符切分成数组,遍历数组,用ord转换字符获取ASCII编码值,标题显示在html中ASCII值占1字节,汉字占2字节长度,
小于127则是计算为1字节,否则计算为2字节
(拆分字符串常用的方法参考:https://www.cnblogs.com/wherein/p/6873489.html)
public function cut_string($title, $length) { $res = preg_split('//u', $title, null, PREG_SPLIT_NO_EMPTY); $byteLength = $length * 2; $titleLength = 0; $result = ''; foreach ($res as $item) { $result .= $item; $titleLength += (ord($item) < 127) ? 1 : 2; if ($titleLength >= $byteLength) { $result .= '...'; break; } } return $result; } public function test() { $titles = [ '11111,,11111111111111111111111111111111111111111111111111111', '저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.', 'Я из категории работающих. Я из категории работающих. Я из категории работающих. ', '33333,,33333333333333333333333333333333333333333333333333333', '一二三四五,,六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十', '哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈', ]; // header('Content-Type: text/html; charset=UTF-8'); foreach ($titles as $title) { echo $this->cut_string($title, 10) . PHP_EOL; } die; }
看一下效果