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

