前言
在工作中遇到一个需求:一串字符串,如“迅雷官方下载“、“快播5.0下载”,需要去掉他们结尾的“官方下载”和”下载“,等字符。
case
case1: str_replace()
我最先开始想到的是使用str_replace函数。但是会有个问题,这个函数可以过滤掉子字符串,虽然可以限定过滤的次数,但是不能限定过滤结尾的字符串,故pass掉。
case2: mb_strpos + mb_substr() + mb_strlen()
思路是这样的:分别获取过滤字符串长度,”官方下载“就是4个字符,然后使用mb_substr切割结尾的4个。
function filter_word($word){
$filterList = ['官方下载','下载'];
foreach ($filterList as $fitler){
$wordLen = mb_strlen($word,'utf-8');
$filterLen = mb_strlen($fitler,'utf-8');
$offset = $wordLen - $filterLen;
//如果待过滤字符串小于过滤字符串跳过(后期优化加上的)
if ($offset <= 0){
continue;
}
$strPos = mb_strpos($word, $filter, $offset,'utf-8') !== false
? mb_strpos($word, $filter, $offset,'utf-8') : false;
if ($strPos !== false){
$word = mb_substr($word,0,$offset,'utf-8');
}
}
}
注意
- mb_strpos函数的第三个参数,$offset为负值并不是从结尾开始算起!
- 使用mb_*来处理Multibyte String
case3: trim()
case2虽然可以解决本需求,但是觉得很麻烦,就问同事,同事有没有更好的办法。
同事:”可以用trim“
我:(心想'trim是第一个被我pass掉的函数啊。‘)trim中文的话会出现乱码。
同事:举个栗子
我:。。。。。
然后我就去官网仔细读了一遍trim函数,收获颇大。
- 不指定第二个参数,默认过滤 空白字符和tnr0x0B
- trim('bacabccba','abc') --> ''
- trim('abcdefg','a..e') --> g
- 过滤数组array_map('trim',$arr)
但是关于trim中文会乱码的原因没找到,通过谷歌终于找到了,里边原理讲得很清楚了,我就不赘述了。
原理
原理中没有说明怎么生成16进制的值,这里做个补充:bin2hex()
此外官网还提示,除了trim,split函数和splice函数也会出现类似问题
case4: preg_replace
在搜寻trim乱码的过程中,发现还可以使用正则替换。当时有可能局限在这个需求,思路一下变的狭隘了。
preg_replace('/下载$/','',$str);
结论
使用正则替换结尾的字符串是最简单的解决方法。
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要
PHP进阶架构师>>>视频、面试文档免费获取docs.qq.com或 者关注咱们下面的知乎专栏
PHP大神进阶zhuanlan.zhihu.com来源:https://www.cnblogs.com/luyuqiang/p/how-to-filter-the-end-of-the-characters.html