如何提取特殊字符间的字符串?PHP提取多组括号内内容需求
提取字符串中所有括号内的内容
嘿,我来帮你搞定这个问题~你之前的代码只能拿到第一个括号里的内容,是因为函数只做了一次匹配查找。要获取所有括号内的文本,这里有两种实用的方法:
方法一:用正则表达式(推荐,简洁高效)
PHP的preg_match_all()函数可以一次性找到所有符合规则的匹配项,刚好适合这个场景。我们可以用一个简单的正则来匹配括号内的内容:
$input = "This is (Name). I live in (Turkey). and so on with other brackets as well"; // 正则模式:匹配括号内的非贪婪内容 preg_match_all('/\((.*?)\)/', $input, $matches); // 提取匹配到的内容,同时去除每个元素的多余空格 $units = array_map('trim', $matches[1]); // 输出结果 print_r($units);
运行这段代码后,$units数组里就会包含所有括号内的内容:["Name", "Turkey"],完全符合你的需求。
正则说明:
\(:匹配左括号(转义是因为括号在正则里是特殊字符)(.*?):非贪婪匹配任意字符,确保只匹配到最近的右括号(避免把多个括号的内容连起来)\):匹配右括号
方法二:修改原函数为循环查找(不用正则的方案)
如果你不想用正则,也可以修改原来的函数,通过循环不断查找下一组括号,直到没有更多匹配为止:
function extract_all_units($string, $start, $end) { $units = []; $pos = stripos($string, $start); // 循环查找所有括号对 while ($pos !== false) { // 定位到左括号后的内容 $str_after_start = substr($string, $pos + strlen($start)); // 找对应的右括号 $end_pos = stripos($str_after_start, $end); // 如果找不到右括号,直接退出循环 if ($end_pos === false) { break; } // 提取括号内的内容并去除空格 $unit = trim(substr($str_after_start, 0, $end_pos)); $units[] = $unit; // 更新字符串,从当前右括号之后开始继续查找 $string = substr($str_after_start, $end_pos + strlen($end)); $pos = stripos($string, $start); } return $units; } // 测试调用 $input = "This is (Name). I live in (Turkey). and so on with other brackets as well"; $units = extract_all_units($input, '(', ')'); print_r($units);
这个函数会循环遍历字符串,每次提取一组括号内容后,就把字符串截断到当前右括号之后,继续查找下一组,直到没有更多左括号为止。
内容的提问来源于stack exchange,提问作者Harmeet Singh
相关产品推荐
相关产品推荐

