媒介在工做中碰到一个需求:一串字符串,如“迅雷官方下载“、“快播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函数,收成颇大。
不指定第二个参数,默认过滤 空白字符和\t\n\r\0\x0Btrim(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等多个常识点高级进阶干货需要的能够免费分享给各人,需要
>>视频、面试文档免费获取" class="LinkCard new css-1wr1m8" data-image="https://pic4.zhimg.com/v2-2686790c46d4e5db4d4b344c23a17517_ipico.jpg" data-image-width="150" data-image-height="150" data-za-detail-view-id="172">PHP进阶架构师>>>视频、面试文档免费获取docs.电话.com/doc/DUEZEWEN0cVZicVRW或 者存眷咱们下面的知乎专栏
PHP大神进阶zhuanlan.zhihu.com/sixstarPHP 来源:https://www.cnblogs.com/luyuqiang/p/how-to-filter-the-end-of-the-characters.html