前言

在工作中遇到一个需求:一串字符串,如“迅雷官方下载“、“快播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\x0B
  • 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);

结论

使用正则替换结尾的字符串是最简单的解决方法。

但是通过case2,自己运用到好多函数以及考虑如何优化来解决一个需求的感觉也是很好的(不知道这算不算算法,哈哈)。

通过这个需求还总结了之前脑子里关于“trim中文乱码”的模糊记忆。

感谢需求!

使用PHP如何去除字符串结尾的字符的更多相关文章

  1. JavaScript trim 实现(去除字符串首尾指定字符)

    String.prototype.trim = function (char, type) { if (char) { if (type == 'left') { return this.replac ...

  2. JavaScript trim 实现去除字符串首尾指定字符的简单方法

    String.prototype.trim = function (char, type) { if (char) { if (type == 'left') { return this.replac ...

  3. 用Oracle的TRIM函数去除字符串首尾指定字符

    去掉首尾空格 SELECT TRIM(' abc '), ltrim(' abc '), rtrim(' abc ') FROM dual; 去掉首尾的其他字符 SELECT /*TRIM(';a;b ...

  4. javascript 去除字符串中重复字符

    /** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...

  5. C#后台去除字符串最后一个字符

    string str = "a,b,c,"; int length = str.length; //获取字符串长度 str = str.substring(0,length-1); ...

  6. c# String.Join 和 Distinct 方法 去除字符串中重复字符

    1.在写程序中经常操作字符串,需要去重,以前我的用方式利用List集合和 contains去重复数据代码如下: string test="123,123,32,125,68,9565,432 ...

  7. String.Join 和 Distinct 方法 去除字符串中重复字符

    Qualys项目中写到将ServerIP以“,”分割后插入数据库并将重复的IP去除后发送到服务器进行Scan,于是我写了下面的一段用来剔除重复IP: //CR#1796870 modify by v- ...

  8. c# 去除字符串中重复字符

    String.Join 和 Distinct 方法 https://www.cnblogs.com/louby/p/6224960.html 1.在写程序中经常操作字符串,需要去重,以前我的用方式利用 ...

  9. 【iOS】去除字符串首尾空格或某字符

    在iOS的实际开发中,常会出现需要去除空格的情况,总结有三种情况: 去除字符串首尾连续字符(如空格): 去除字符串首部连续字符(如空格): 去除字符串尾部连续字符(如空格): 去除字符串首尾连续字符( ...

随机推荐

  1. overflow:hidden失效

    overflow:hidden失效 为了页面的健壮性,我们常常需要使用overflow:hidden.有时候是为了防止布局被撑开,有时候是为了配合其它规则实现文字截断,还有时候纯粹是为了创建块级上下文 ...

  2. docker部署一个简单的mian.py项目文件

    安装docker yum install -y docker  启动docker systemctl start docker   查询可安装的Python版本,默认centos python 2.7 ...

  3. BZOJ 3546 [ONTAK2010]Life of the Party (二分图最大匹配必须点)

    题解:给出一个二分图,问你取点哪个点会使得二分图匹配数减少. 解法:其实就是问二分图匹配的必须点.先对初始二分图做一次最大匹配. 现在考虑左边点,看残余网络上的边重新构图:如果是匹配边那么就从右往左连 ...

  4. Employment Planning

    Employment Planning 有n个月,每个月有一个最小需要的工人数量\(a_i\),雇佣一个工人的费用为\(h\),开除一个工人的费用为\(f\),薪水为\(s\),询问满足这n个月正常工 ...

  5. sql 合并查询结果

    在使用js报表工具的时候,常常需要提供json数据进行显示, 在sql查询的时候就需要构造合适的查询结果出来; 就用到了合并两个没有关联关系的表数据, SELECT SUM(a1.amount) AS ...

  6. springboot集成使用rabbitmq笔记(3.基本过程)

    使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.AMQP协议 AMQP 0-9-1的工作过程如下图:消息(message)被发布者(publisher)发送给交 ...

  7. 云栖PPT下载 | 开源界大咖集体现身,开源数据库专场重点再回眸!

    阿里云开源数据库项目最新发布 阿里巴巴集团副总裁.阿里云智能数据库事业部总裁.高级研究员李飞飞(飞刀).阿里云数据库资深技术专家楼方鑫(黄忠)以及阿里云数据库技术专家傅宇(齐木)三位阿里云技术专家为大 ...

  8. ArrayList,LinkedList,Vector集合的认识

    最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ...

  9. Luogu P2042 [NOI2005]维护数列

    题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格) 输入输出格式 输入格式: 输入文件的第 1 行包含两个数 N 和 M, ...

  10. 基于mybatis-plus的代码生成

    基于mybatis-plus的代码生成 前言 随着敏捷开发模式的推广,伴着日益增长的需求,日常工作中我们越来越注重效率和便捷性.今天我们就来探讨下如何自动生成代码,准确地说是如何依赖数据库生成我们的e ...