使用PHP如何去除字符串结尾的字符
前言
在工作中遇到一个需求:一串字符串,如“迅雷官方下载“、“快播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如何去除字符串结尾的字符的更多相关文章
- JavaScript trim 实现(去除字符串首尾指定字符)
String.prototype.trim = function (char, type) { if (char) { if (type == 'left') { return this.replac ...
- JavaScript trim 实现去除字符串首尾指定字符的简单方法
String.prototype.trim = function (char, type) { if (char) { if (type == 'left') { return this.replac ...
- 用Oracle的TRIM函数去除字符串首尾指定字符
去掉首尾空格 SELECT TRIM(' abc '), ltrim(' abc '), rtrim(' abc ') FROM dual; 去掉首尾的其他字符 SELECT /*TRIM(';a;b ...
- javascript 去除字符串中重复字符
/** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...
- C#后台去除字符串最后一个字符
string str = "a,b,c,"; int length = str.length; //获取字符串长度 str = str.substring(0,length-1); ...
- c# String.Join 和 Distinct 方法 去除字符串中重复字符
1.在写程序中经常操作字符串,需要去重,以前我的用方式利用List集合和 contains去重复数据代码如下: string test="123,123,32,125,68,9565,432 ...
- String.Join 和 Distinct 方法 去除字符串中重复字符
Qualys项目中写到将ServerIP以“,”分割后插入数据库并将重复的IP去除后发送到服务器进行Scan,于是我写了下面的一段用来剔除重复IP: //CR#1796870 modify by v- ...
- c# 去除字符串中重复字符
String.Join 和 Distinct 方法 https://www.cnblogs.com/louby/p/6224960.html 1.在写程序中经常操作字符串,需要去重,以前我的用方式利用 ...
- 【iOS】去除字符串首尾空格或某字符
在iOS的实际开发中,常会出现需要去除空格的情况,总结有三种情况: 去除字符串首尾连续字符(如空格): 去除字符串首部连续字符(如空格): 去除字符串尾部连续字符(如空格): 去除字符串首尾连续字符( ...
随机推荐
- 【Java】 java判断字符串是否为空的方法总结
以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: ...
- Java菜鸟笔记
System.out.println( ); 会在输出完毕后自动换行 System.out.print( ); 在输出完毕后不会自动换行 MyEclipse/Eclipse快捷键: 定位到某一行, ...
- centos6系列更换阿里yum源
1.首先备份原来的cent os官方yum源 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. ...
- ubuntu批量转换所有子文件夹下图片文件格式
第一步按照 sudo apt-get install imagemagick 对于一个文件,可以: convert ubuntuhandbook.png ubuntuhandbook.jpg 对于多个 ...
- 笔记65 Spring Boot快速入门(五)
SpringBoot+JPA 一.什么是JPA? JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期 ...
- Java创建线程后,调用start()方法和run()的区别
1) start方法: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的start()方法来启动一个线程,这时此 ...
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全.它会解除由线程获取的所有锁定,而且如果对象处于一种不 ...
- VS2017编译64位CloudCompare
需求:编译一个支持读写las点云的CC,然后再开发CC插件实现业务功能. 编译环境: 1.Windows 10 2.Visual Studio 2017 Community 3.Qt 5.9.4 开源 ...
- openFrameworks Download
{ https://openframeworks.cc/zh_cn//download/ } 0.10.1 是最新发布的版本. 这个版本是修改了一些BUG的小版本,与版本 0.10.1100%兼容而且 ...
- bzoj1066题解
[解题思路] 考虑拆点,把每根石柱拆成两个点,具体可以理解为石柱底部和石柱顶部,能爬到石柱顶部的蜥蜴只有有限只,而且蜥蜴只有爬到了石柱顶部才能跳到其他石柱的底部. 这样,考虑如下建图: 将每个有蜥蜴的 ...