使用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的实际开发中,常会出现需要去除空格的情况,总结有三种情况: 去除字符串首尾连续字符(如空格): 去除字符串首部连续字符(如空格): 去除字符串尾部连续字符(如空格): 去除字符串首尾连续字符( ...
随机推荐
- Tomcat启动脚本(3)setclasspath.bat
@echo off rem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor lic ...
- collections库的namedtuple+pytest的使用
from collections import namedtupleTask=namedtuple('Task',['summary','owner','done','id'])Task.__new_ ...
- 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)【有源码】
原文:循序渐进学.Net Core Web Api开发系列[13]:中间件(Middleware) 系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:ht ...
- Win7下设置一键关闭所有程序的功能
(文章仅作个人整理和笔记) 在很多情况下,上班族发生这种情况的比较多吧,忙碌的一天下来,准备下班走人的时候,发现自己的电脑打开了好多程序,需要一个一个去关闭,那么有没有什么方法可以实现一键快速关闭所有 ...
- Aspose.Words转换为PDF的时候字体丢失的问题解决
系统中明明有字体的,Word中显示也正常,就是转换为PDF以后不正常,字体丢失,被替换成了等线字体 好一番研究,终于找到原因 ,原因是Windows\Fonts下的文件,有些只是虚拟的路径,真正的字体 ...
- [转]【Git】rebase 用法小结
https://www.jianshu.com/p/4a8f4af4e803 本文主要参考 https://git-scm.com/docs/git-rebase rebase在git中是一个非常有魅 ...
- Unity HOME
{ https://unity.com/cn?_ga=2.134655153.1528856053.1574826116-818341090.1574826116 }
- 深入理解Magento – 第十章、十一章(英文原版地址,仅供参考)
深入理解Magento – 第十章 – Magento系统覆盖和升级 http://alanstorm.com/magento_upgrade_rewrite_override 深入理解MAGENTO ...
- springBoot和MyBatis整合中出现SpringBoot无法启动时处理方式
在springBoot和Myatis 整合中出现springBoot无法启动 并且报以下错误 Description: Field userMapper in cn.lijun.control ...
- MaxCompute新功能发布
2018年Q3 MaxCompute重磅发布了一系列新功能. 本文对主要新功能和增强功能进行了概述. 实时交互式查询:Lightning on MaxCompute 生态兼容:Spark on Max ...