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

PHP提取多相同起止符间字符串并存入数组问题求助

解决PHP提取所有起止符间字符串的问题

嘿,我懂你的困扰!你现在用的get_string_between函数确实只能抓取第一个符合条件的片段,要拿到所有匹配结果并存入数组的话,我们可以用两种简单的方法来改造,不管是循环遍历还是正则表达式,都很适合PHP新手上手~

先说说原函数的问题

你的原函数逻辑是找到第一个$start的位置,再找它后面第一个$end的位置,截取中间内容后直接返回——所以自然只会拿到第一个匹配项,没法继续找后面的内容。

方案一:循环遍历版(基于原函数逻辑改造)

我们可以在原函数的基础上加入循环,每次找到一个匹配后,就从当前$end的位置之后继续查找下一个$start,直到找不到为止,把所有结果存入数组:

function get_all_strings_between($string, $start, $end) {
    $results = [];
    $string = ' ' . $string; // 和原函数保持一致的前置空格处理
    $ini = strpos($string, $start);
    
    // 循环查找,直到找不到下一个$start
    while ($ini !== false) {
        $ini += strlen($start); // 跳过$start本身
        $end_pos = strpos($string, $end, $ini);
        
        // 确保找到有效的$end位置,避免出现负数长度
        if ($end_pos === false) {
            break;
        }
        
        $len = $end_pos - $ini;
        if ($len > 0) {
            $results[] = substr($string, $ini, $len);
        }
        
        // 从当前$end的位置之后,继续查找下一个$start
        $ini = strpos($string, $start, $end_pos + strlen($end));
    }
    
    return $results;
}

// 测试你的示例
$string='afghjuyakkg'; 
$start_string='a'; 
$end_string='g';
$result = get_all_strings_between($string, $start_string, $end_string);
print_r($result); // 输出:Array ( [0] => f [1] => kk )

这个版本的好处是完全沿用你原函数的思路,不需要理解正则,而且不用处理特殊字符的转义,适合起止符里有特殊符号的场景。

方案二:正则表达式版(更简洁)

如果你的起止符比较简单,用正则会更省事,preg_match_all可以一次性抓取所有匹配结果:

function get_all_strings_between_regex($string, $start, $end) {
    // 转义起止符中的正则特殊字符(比如.、*、+这些),避免正则语法出错
    $start_escaped = preg_quote($start, '/');
    $end_escaped = preg_quote($end, '/');
    
    // 正则模式:用非贪婪匹配(.*?)确保只抓取最近的$end之前的内容
    $pattern = "/$start_escaped(.*?)$end_escaped/";
    preg_match_all($pattern, $string, $matches);
    
    // $matches[1]就是所有匹配到的中间内容组成的数组
    return $matches[1];
}

// 测试示例
$string='afghjuyakkg'; 
$start_string='a'; 
$end_string='g';
$result = get_all_strings_between_regex($string, $start_string, $end_string);
print_r($result); // 输出:Array ( [0] => f [1] => kk )

这里要注意:如果你的$start或$end包含正则元字符(比如.、*、?),一定要用preg_quote转义,不然正则会解析出错哦。

内容的提问来源于stack exchange,提问作者Gulzar Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:10:29