php删除字符串末尾子字符

本文探讨了在处理重复子字符串时遇到的问题,特别是使用 PHP 的 rtrim 函数时的常见误区,并介绍了两种有效的替代方案:使用 substr_replace 进行替换操作,以及利用正则表达式进行精确匹配。

作者:林子木 wolinxuebin

转载请保留:http://blog.youkuaiyun.com/wolinxuebin


   今天想处理下原先由于失误而多加的子字符,如 linzimu.apk.apk。

    起初使用的是rtrim,其实这个函数是trim的衍生,trim是去除收尾,而rtrim是去除字符末尾,还有一个是去除字符头部的是ltrim。

    使用如下代码:

$out = rtrim($in,'.apk');

输出的结果是linzimu,那好我想,那我就直接再
$out .= '.apk'
就是我想要的东西了


后来保险起见,在上传服务器前都要检查下文件是否存在。结果2W多的数据,有4k是不存在的。


找了半天终于找到原因了,其实是自己没有细看PHP手册。

ltrim 后面是 charlist 而不是 $substring

也就是说 后面是字符列表 不一定按照这个顺序,

比如linzimua,apk,apk中的a就会被去除掉。

去除的原则是,一直都匹配一直去除,知道第一个不匹配为止。


所以立马改用另一种方法,可以使用

思路1:所可以变化下思维去除字符串,可以变为替换字符串,替换为NULL

使用

substr_replace($test,'',-4);

思路2:也可以变为,将自己想要的字符串作为子字符串提取出来

$test = "lin.apk.apk";
preg_match("#^((.+)\.(.+))\.#i", $test,$m);
echo $m[1];


<think>嗯,用户的问题是关于在SQL查询中如何实现字符串的正向包含和反向匹配的方法。首先,我需要确认用户提到的“正向包含”和“反向匹配”具体指的是什么。正向包含应该是指判断字符串是否包含某个串,比如检查是否有串出现在字符串的任何位置。反向匹配可能是指从字符串末尾开始匹配,例如查找最后一个出现的特定字符串的位置,或者判断字符串是否以某个结尾。 接下来,我需要回忆SQL中的字符串函数。对于正向包含,常用的方法是使用`LIKE`操作符或者`CHARINDEX`函数。`LIKE`可以用通配符`%`来匹配任意字符,比如`WHERE column LIKE '%substring%'`。`CHARINDEX`返回串的位置,如果大于0就表示存在。另外,用户提供的引用[3]中提到了正则表达式的使用,比如`REGEXP`,但不同数据库的支持情况不同,比如MySQL支持`REGEXP`,而SQL Server则用`LIKE`更常见。 关于反向匹配,用户提到的引用[2]中使用了`REVERSE()`函数配合`CHARINDEX`来找到从右向左的字符位置。例如,要找到最后一个`-`的位置,可以先反转字符串,找到第一个`-`的位置,再计算原字符串中的位置。这可能用于截取串,比如从末尾开始截取到某个字符为止的部分。 另外,引用[4]提到了`RIGHT`函数,可以用来截取字符串右边的部分,这可能与反向匹配后的截取有关。比如,结合反向查找的位置,用`SUBSTRING`或`RIGHT`来获取需要的部分。 用户的需求可能是在SQL中实现类似正则表达式的正向和反向匹配,或者从字符串两端开始查找串。需要根据不同的数据库系统(如MySQL、SQL Server、PostgreSQL)来提供相应的函数,因为语法可能有所不同。例如,MySQL的`REGEXP`支持正则,而SQL Server则需要用`PATINDEX`或者组合函数。 还需要考虑性能问题,比如使用函数是否会导致索引失效,尤其是当在WHERE句中使用函数处理列时,可能会影响查询效率。但用户的问题可能更关注功能的实现,所以暂时先提供方法,再在注意事项里提到性能考虑。 总结一下,回答的结构应该是先介绍正向包含的方法,包括`LIKE`、`CHARINDEX`、`PATINDEX`和正则表达式,然后介绍反向匹配的方法,如`REVERSE`配合`CHARINDEX`,以及使用`RIGHT`和`SUBSTRING`来截取字符串。给出具体示例,并注明不同数据库的差异。最后可能加上注意事项,比如性能或函数支持的问题。 需要检查提供的引用内容是否适用。例如,引用[2]中的例使用了`reverse(path1)`和`charindex`来找到最后一个分隔符的位置,然后截取串。这可能适用于SQL Server,因为涉及到`LEN`函数,而其他数据库可能使用`LENGTH`。引用[3]中的正则示例可能在MySQL中有效,而引用[4]的`RIGHT`函数是通用的。 用户的问题可能是在处理类似IP地址或路径的字符串,如引用[5]中的IP地址查询,可能需要截取或匹配特定部分。例如,从路径中获取最后一个`-`后的内容,或者检查是否以特定结尾。 最后,确保回答符合用户要求的格式:使用中文,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不太需要数学公式。同时生成相关问题,如不同数据库的差异,性能优化,正则表达式的高级用法等。</think>### SQL字符串正向包含与反向匹配的实现方法 在SQL查询中,字符串的正向包含和反向匹配可通过内置函数和正则表达式实现,具体方法如下: --- #### **一、正向包含(字符串存在性判断)** 1. **`LIKE`操作符** 使用`%`通配符匹配任意字符,例如判断字段是否包含`"sql"`: ```sql SELECT * FROM table WHERE column LIKE '%sql%'; ``` 2. **`CHARINDEX`函数(SQL Server)或`INSTR`函数(MySQL/Oracle)** 返回字符串的起始位置,若结果>0则表示存在: ```sql -- SQL Server SELECT * FROM table WHERE CHARINDEX('sql', column) > 0; -- MySQL SELECT * FROM table WHERE INSTR(column, 'sql') > 0; ``` 3. **正则表达式(部分数据库支持)** MySQL使用`REGEXP`进行正则匹配[^3]: ```sql SELECT * FROM table WHERE column REGEXP 'sql'; ``` --- #### **二、反向匹配(从右向左匹配)** 1. **截取末尾字符串** 使用`RIGHT`函数截取末尾N位字符[^4]: ```sql SELECT RIGHT('192.168.1.1', 3); -- 输出: '1.1' ``` 2. **查找最后一个分隔符的位置** 通过`REVERSE`函数反转字符串后定位分隔符[^2]: ```sql -- SQL Server示例:截取路径最后一个'-'前的部分 SELECT SUBSTRING(path1, 1, LEN(path1) - CHARINDEX('-', REVERSE(path1)) + 1); ``` 3. **正则表达式反向匹配** 使用`$`匹配字符串末尾(MySQL示例)[^3]: ```sql SELECT 'abc' REGEXP 'c$'; -- 返回1(匹配成功) ``` --- #### **三、综合应用示例** **场景**:查询IP地址表中以`192.168`开头的记录,并截取IP最后两位(如`1.1`): ```sql -- 正向匹配开头 + 反向截取末尾 SELECT cons_id, RIGHT(ip, 3) AS ip_suffix -- 假设格式为'xxx.x.x' FROM hsql.c_ip WHERE ip LIKE '192.168%'; -- 引用[5]中表结构 ``` --- #### **注意事项** 1. 不同数据库函数支持不同(如`REGEXP`在MySQL可用,SQL Server需用`PATINDEX`)[^4]; 2. 反向操作可能影响性能,建议对字段建立索引优化。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值