Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php substr Utf-8问题_Php_Utf 8_Strip Tags - Fatal编程技术网

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.rqasd

elamiİ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ë