WordPress从3.30版本开始,有了官方的文字阶段函数,我们自动截取文字作为摘要时再也不用添加自定义文字截断函数到主题中了,对于一般的主题来说,这个函数提供了很大的方便,可是遇到网站中同时有中英文内容时,这个功能用起来就有点不顺利了。
这要先从中英文的区别说起,语言的最小单位是字符,在中国语言中,一个字(相当于英语的字母)就能表达一个完整的意思(很简洁很强大有木有?),而英文中,一个字母表达一个完整意思的情况很少(除了 a,I 这些极个别的),要表达一个完整的意思,绝大多数时候,英语都要用由几个字母组成的单词(真够麻烦的,怪不得这么多人不喜欢学英语)。
从程序分词角度来说,英文分词是以空格作为分词边界的,而中文分词是以 \u 这样的 UTF-8字符标记作为边界的。在字数统计上,中文一个字符就是一个字,而英语一个单词才能算一个字。
我们来看一下wp_trim_words
的参数:
wp_trim_words( $text, $num_words = 55, $more = null );
注意其中第二个参数:$num_words
,这个参数是需要截断的字数,就拿「Hello wonderful world」和「你好世界」来说吧,看一下下面的例子。
$text1 = "Hello wonderful world";
$text2 = "你好世界";
wp_trim_words( $text1, 2, $more = null ); //输出的结果是:Hello wonderful
wp_trim_words( $text2, 2, $more = null ); //输出的结果是:你好
看到这里,今天要说的问题就出现了,同样截取两个字,输出的内容长度相差的却有点远, 大家知道,网页排版关键是对齐,这还只是截取了两个字,放到正常的主题制作中,需要截取几十个字的时候,结果可想而知。
怎么解决这个问题?我的办法是用mb_strimwidth函数代替,这货直接是按照字符数截取的,不管你是英语汉语还是火星语,它都一视同仁,完全不考虑这些字符所表达的意思,虽然没有wp_trim_words处理得智能,却能实实在在的解决这里出现的问题。
所以:任何函数都有存在的意义,都是为了解决相应场景里出现的问题而存在的,我们使用起来,要一视同仁,能解决问题的函数就是好函数。