如何用substr和strrpos清理特定字符后的字符串并修复空值问题
URL参数截取修复方案
嘿,我来帮你搞定这个问题!你遇到的空值问题,根源在于strrpos找不到指定子串时会返回false,而substr会把这个false当作0来处理——substr($url, 0, 0)的结果就是空字符串,只要原URL里有任何一个关键词不存在,后续的截取操作就会直接把整个URL清空。
下面给你两种靠谱的修复方法:
方法一:检查关键词存在性再截取
这种方法保留你原来的思路,但每次截取前先确认关键词确实存在,避免无效截取导致空值:
$url = '/resutls?offer=1&gclid=CjwKCAjw1f_pBRAEEiwApp0JK'; // 把需要移除的关键词整理成数组,方便遍历 $removeKeywords = [ '&gclid', '&utm_source', '?utm_campaign', '?utm_medium', '?token', '&fbclid', '&utm_campaign', '&utm_medium', '&token' ]; foreach ($removeKeywords as $keyword) { $pos = strrpos($url, $keyword); // 只有找到关键词时才执行截取操作 if ($pos !== false) { $url = substr($url, 0, $pos); } } echo $url; // 输出:/resutls?offer=1
方法二:用正则表达式批量处理(更简洁高效)
既然你要移除的都是类似gclid、utm_*这类追踪参数,用正则可以一次性搞定,比逐个处理更省心:
$url = '/resutls?offer=1&gclid=CjwKCAjw1f_pBRAEEiwApp0JK'; // 正则匹配并移除所有目标追踪参数(包括前面的分隔符) $url = preg_replace('/(&|\?)(gclid|utm_source|utm_campaign|utm_medium|token|fbclid)=[^&]*/', '', $url); // 处理可能残留的末尾分隔符(比如最后一个参数被移除后剩下的?或&) $url = rtrim($url, '?&'); echo $url; // 输出:/resutls?offer=1
这个正则的逻辑是:
(&|\?)匹配参数前面的分隔符(要么是&要么是?)(gclid|utm_source|...)是你要移除的参数名列表=[^&]*匹配参数的取值部分,直到下一个&或者字符串结束
这样不管URL里有没有这些参数,都不会出现截空的问题,还能一次性清理所有目标参数。
内容的提问来源于stack exchange,提问作者EnexoOnoma
相关产品推荐
相关产品推荐

