Heim  >  Artikel  >  Backend-Entwicklung  >  php截取中文字符串,在给定字符串第一回出现的位置处进行截取,截取100个字符

php截取中文字符串,在给定字符串第一回出现的位置处进行截取,截取100个字符

WBOY
WBOYOriginal
2016-06-13 10:34:411020Durchsuche

php截取中文字符串,在给定字符串第一次出现的位置处进行截取,截取100个字符。
如题,利用下面两种方式进行截取,发现取出的结果都不对,请大家指点下。
其中$word为将要被截取的字符串,$key_word为给定的子串
方法一:

PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->mb_substr($word,strpos($word,$key_word)/3,100,'utf-8');


方法二:
PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->$start_key = mb_strpos($word,$key_word);$start_key = $start_key>0?$start_key:0;mb_substr($word,$start_key,100,'utf-8');


------解决方案--------------------
我发现了一个很好用的函数,mb_strimwidth($str, 0, 80, '', 'utf8'),安字符宽度截取
------解决方案--------------------
我真汗了, 不懂编码的人写出来的代码真心让人蛋疼, 都懂的.

记住,strstr/strpos这些是给ASCII字符串用的,也就是1字节1字节比对的,根本不在乎编码,对于GBK/UTF8,在一定情况下也可以正常工作,因为GBK/UTF8的非ASCII字符的单字节都是第7位为1的,但GBK码容易出问题,因为两个2字节字符的1字节拼起来可能造成错误匹配。

MB就是认编码的函数了,所以传给他的以及它返回的数字都是字符数,不是字节数。

你看你第一个代码用strpos了,要是utf8编码还行,其他的说实话都不行。UTF8也就算了,你还假定字符都是3字节。。。这就错了。

第二个代码就靠谱多了,可惜mb_strpos你又没告诉它encoding,这不就完蛋了。




------解决方案--------------------
mb_string 函数组不是这么用法的

mb_internal_encoding("utf-8");
mb_substr($word, mb_strpos($word, $key_word), 100);
------解决方案--------------------
PHP code
//字符串截取,所有字符长度都是1,gbk、utf-8通用。function cut($str, $len = 12, $dot = '...') {    if (mb_strlen($str, "utf-8") 
                 
              
              
        
            
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn