反转UTF8编码中文字符串的2种方法
某天查手册时,看到strrev函数下面有一个 utf8_strrev函数的实现,觉得有些意思,于是自己使用mb开头的函数写了另一个实现。
【第一种方案】
使用正则匹配出所有的内容到数组,然后使用数组中的反转函数将整个数组反转,然后将数组转化成字符串
其代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php header("Content-type:text/html;charset=utf-8"); $str = "bb我是中国人aaaa"; /** * 反转utf8的字符串,使用正则和数组实现 * @param string $str * @return string */ function utf8_strrev($str){ preg_match_all('/./us', $str, $ar); return implode('', array_reverse($ar[0])); } echo utf8_strrev($str), '<br />'; |
其中正则的两个修正符的说明如下:
u (PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。
s (PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.) 匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。
【第二种方案】
使用Multibyte String Functions实现
算出字符串在utf8ut编码下的长度,倒序取每个utf8字符,连接起来,返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php header("Content-type:text/html;charset=utf-8"); $str = "bb我是中国人aaaa"; /** * 反转utf8的字符串,使用mb开头的函数 * @param string $str * @return string */ function mb_strrev($str) { $len = mb_strlen($str, 'UTF-8'); $string = ''; for ($i = $len - 1; $i >= 0; $i--) { $string .= mb_substr($str, $i, 1, 'UTF-8'); } return $string; } echo mb_strrev($str); |
最后一句:多看手册
学习了~~
第一种我怎么感觉如此模糊….
在手册上看到的,就是正则修正符 u 的使用
哥懂了..
it was very interesting to read http://www.phppan.com
I want to quote your post in my blog. It can?
And you et an account on Twitter?
thanks. http://twitter.com/phppan
I would like to exchange links with your site http://www.phppan.com
Is this possible?
Pingback引用通告: 标记它!博客 » Blog Archive » PHP字符串反转算法以及MySQL事务
Pingback引用通告: 标记它!博客 » Blog Archive » PHP字符串反转算法以及MySQL事务
这个知识点我还没看完,接到新公司的入职邀请了,不用再准备面试和笔试了,真好,谢谢你提供的第一种方法,我第一次看到,受教了。