我有一个特殊语言字符串。
先秦兩漢先秦兩漢先秦兩漢漢先秦兩漢漢先秦兩漢( 243071)
我的要求是使用php将字符数限制超出我的要求。就像它超过15个字符一样。
为此,我尝试了
if(mb_strlen($string) > 15){
$seed = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
}
但它破灭了。它并没有打破所有的情况,但一个有35个字符。
我尝试的另一种方法是使用此功能: -
function word_chunk($str, $len = 76, $end = "||") {
$pattern = '~.{1,' . $len . '}~u'; // like "~.{1,76}~u"
$str = preg_replace($pattern, '$0' . $end, $str);
return rtrim($str, $end);
}
请帮助并理解我只需要MB字符的帮助
答案 0 :(得分:2)
这将在每10个“扩展字形集群”之后拆分你的字符串(由Wiktor在评论中提出)。
var_export(preg_split('~\X{10}\K~u', $string));
preg_split('~.{10}\K~u', $string)
将对您的示例字符串起作用,但对于超出您的范围的情况,\X
在处理unicode时更加强大。
来自https://www.regular-expressions.info/unicode.html:
你可以考虑\ X点的Unicode版本。但有一点不同:\ X始终匹配换行符,而点与换行符不匹配,除非您启用点匹配换行符匹配模式。
\K
重新启动全字符串匹配,因此拆分中没有字符丢失。
以下是$len=10
https://regex101.com/r/uO6ur9/2
代码:(Demo)
$string='先秦兩漢先秦兩漢先秦兩漢漢先秦兩漢漢先秦兩漢( 243071)';
var_export(preg_split('~\X{10}\K~u',$string,));
输出:
array (
0 => '先秦兩漢先秦兩漢先秦',
1 => '兩漢漢先秦兩漢漢先秦',
2 => '兩漢( 243071',
3 => ')',
)
实现:
function word_chunk($str,$len){
return preg_split('~\X{'.$len.'}\K~u',$str);
}
虽然preg_split()
可能比preg_match_all()
略慢,但一个优点是preg_split()
提供了所需的1维数组。 preg_match_all()
生成一个多维数组,您只需要访问[0]
子数组的元素。