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
相关产品推荐
相关产品推荐

