You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何提取字符串中所有指定分隔符间的子串生成数组?

优化PHP函数提取所有目标子串

问题背景

需求:处理形如20-100=500&101-200=1000的字符串,提取每个-右侧至=左侧的中间子串,最终得到数组Array ( [0] => 100 [1] => 200 )。
现有PHP函数仅能返回第一个匹配结果,需优化以获取所有目标子串。

现有函数代码:

function mid($start, $end, $str) {
    $str = substr($str, strpos($str, $start) + strlen($start));
    $data[]=substr($str, 0, strpos($str, $end));
return $data;
}

调用语句:

print_r(mid('-', '=', '20-100=500&101-200=1000'));

当前输出:Array ( [0] => 100 )


优化方案

方法一:正则表达式(简洁高效)

利用正则直接匹配所有符合规则的子串,是最省心的实现方式:

function mid($str) {
    preg_match_all('/-(\d+)=/', $str, $matches);
    return $matches[1];
}

// 调用示例
print_r(mid('20-100=500&101-200=1000'));

输出结果:

Array
(
    [0] => 100
    [1] => 200
)

说明:正则/-(\d+)=/中,-和=匹配固定分隔符,(\d+)捕获中间的数字序列;preg_match_all会找出所有匹配项,$matches[1]即为所有目标子串组成的数组。

方法二:循环迭代查找

如果偏好不用正则,可通过循环逐个定位分隔符位置提取子串:

function mid($start, $end, $str) {
    $data = [];
    $currentPos = 0;
    $startLen = strlen($start);
    $endLen = strlen($end);

    while (($startPos = strpos($str, $start, $currentPos)) !== false) {
        $startPos += $startLen;
        $endPos = strpos($str, $end, $startPos);
        
        if ($endPos === false) break;
        
        $data[] = substr($str, $startPos, $endPos - $startPos);
        $currentPos = $endPos + $endLen;
    }
    return $data;
}

// 调用示例
print_r(mid('-', '=', '20-100=500&101-200=1000'));

说明:通过循环不断更新查找起始位置,每次找到-和=的位置后提取中间子串,直到无法找到下一组分隔符为止。

内容的提问来源于stack exchange,提问作者Sukrat Chakravarti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:36:03