Php substr Utf-8问题
当我运行此代码时Php substr Utf-8问题,php,utf-8,strip-tags,Php,Utf 8,Strip Tags,当我运行此代码时 $string='<p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p>'; echo substr(strip_tags(trim(html_entity_decode($string
$string='<p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p><p>Şelamiİnnşşasdüğ213,123wqeq.weqw.rqasd</p>';
echo substr(strip_tags(trim(html_entity_decode($string, ENT_COMPAT, 'UTF-8'))), 0, 14);;
$string='elamiİnnşasdğ213123wqeq.weqw.rqasdelamiİnnşasdğ213123wqeq.weqw.rqasd;
echo substr(strip_标签(trim(html_entity_decode($string,ENT_COMPAT,'UTF-8'))),0,14);;
我得到这个结果
Şelamiİnnş�
我的错误是什么?您应该使用多字节
substr()
函数
试一试
|首先,总是将你的问题分解成更小的部分,看看哪里出了问题:
$string=html_entity_decode($string, ENT_COMPAT, 'UTF-8');
echo $string, "\n";
$string = trim($string);
echo $string, "\n";
$string = strip_tags($string);
echo $string, "\n";
$string = substr($string, 0, 14);
echo $string, "\n";
如果运行该命令,您将看到问题与strip\u标记
无关,而是与substr
有关
原因很简单:PHP中的字符串只是一系列字节;像substr
这样的函数不会以任何有意义的方式计算“字符”。因此substr($string,0,14)
只需获取字符串的前14个字节,在本例中,正好使用UTF-8拆分一个编码为多个字节的“字符”
最常见的解决方案是使用(作为“mbstring”PHP扩展的一部分)根据某种编码对“字符”进行计数:
$string = mb_substr($string, 0, 14, 'UTF-8');
echo $string, "\n";
// Şelamiİnnşşasd
请注意,这将截断为14个Unicode代码点,因此,如果字母是使用“组合变音符号”编码的,则仍然可以执行一些奇怪的操作,例如去掉字母的重音
在某些情况下,另一种选择是使用(部分“intl”扩展)在“graphemes”上拆分,这大致就是人们认为的“字符”或“字母”。在这种情况下,它给出了相同的结果:
$string = grapheme_substr($string, 0, 14, 'UTF-8');
echo $string, "\n";
// Şelamiİnnşşasd
但在其他情况下,它可能不会:
$string = 'noël';
echo mb_substr($string, 0, 3, 'UTF-8'), "\n"; // noe
echo grapheme_substr($string, 0, 3), "\n"; // noë
您的预期输出是pelaminasd213123wqeweqwrqasdppelaminasd213123wqeweqwrqasdppelaminasd213123wqeweqwrqqawrqasdp?如果不使用子字符串,我会得到这个结果。aŞŞŞşşşğğğii,qweiiqşweşelamiİnnşasdğ213123wqeq.weqw.rqasd您的预期输出是什么?
pelaminasd213123wqeqeqeqwwqwqwqwqwqwqwqwqwqwqppedlaminasd213123wqqeqqequ>subdefined我得到这个错误。你需要启用mbstring
PHP扩展
$string = 'noël';
echo mb_substr($string, 0, 3, 'UTF-8'), "\n"; // noe
echo grapheme_substr($string, 0, 3), "\n"; // noë