如何让preg_grep仅返回单个匹配结果或重置数字键?
问题描述
我正在开发一段代码,通过WordPress REST API和curl获取站点图片链接。代码先提取curl返回JSON中的图片链接,取出每个链接的basename并拆分,再将拆分后的术语与当前WordPress文章标题进行匹配。当标题中的任意术语在图片名称中匹配时,preg_grep会返回结果,但我希望仅获取单个一维结果(比如第一个匹配项),尝试用preg_match却得到了多维数组,需要解决这个问题。
当前preg_grep的输出结果:
array(1) { [1]=> string(4) "buzz" } array(1) { [3]=> string(10) "actualites" }
我的简化代码如下:
$title = get_the_title(); $regex = array('/[^\p{L}\p{N}\s]/u', '/\s/'); $repl = array('', '-'); $slug = preg_replace($regex, $repl, $title); $res_title = explode('-', $slug); $path = array( 'https://ivredevi.fr/wp-json/wp/v2/media?per_page=100&page=1', ); $node_count = count($path); $curl_arr = array(); $master = curl_multi_init(); for($i = 0; $i < $node_count; $i++) { $url =$path[$i]; $curl_arr[$i] = curl_init($url); curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($master, $curl_arr[$i]); } do { curl_multi_exec($master,$running); } while($running > 0); for($i = 0; $i < $node_count; $i++) { $results = curl_multi_getcontent ( $curl_arr[$i] ); $img = json_decode($results, true); $arr_col = array_column($img, 'source_url'); $new_array = []; foreach ($arr_col as $ncol) { $cnt = basename($ncol, '.jpg'); $names = explode('-', $cnt); foreach ($res_title as $value) { $pattern = "/$value/i"; $results = preg_grep($pattern, $names); $sk = []; if($results){ var_dump($results); } } } }
解决方案
要获取单个一维匹配结果,可按以下方式调整代码:
核心修改思路
- 找到匹配后立即终止循环:一旦找到符合条件的匹配项,跳出所有相关循环,避免无效遍历。
- 提取preg_grep的首个元素:preg_grep返回数组,用
reset()或array_values()[0]直接拿到一维字符串结果。
修改后的核心代码片段:
// 定义变量存储最终匹配结果 $matchedTerm = null; foreach ($arr_col as $ncol) { if ($matchedTerm !== null) break; // 找到结果就停止遍历图片 $cnt = basename($ncol, '.jpg'); $names = explode('-', $cnt); foreach ($res_title as $value) { if ($matchedTerm !== null) break; // 找到结果就停止遍历标题术语 $pattern = "/$value/i"; $results = preg_grep($pattern, $names); if (!empty($results)) { // 提取第一个匹配的术语 $matchedTerm = reset($results); // 也可以用 array_values($results)[0] 实现相同效果 break; } } } // 输出最终结果 if ($matchedTerm) { var_dump($matchedTerm); }
关键说明
reset($results):将数组指针移至第一个元素并返回该元素,直接得到一维字符串结果。- 嵌套循环中加入
break和$matchedTerm !== null的判断,确保找到第一个匹配项后立即停止所有后续遍历,提升代码效率。 - 如果不需要严格的"第一个匹配"逻辑,只要任意一个匹配项即可,同样可以用上述方法提取结果后终止循环。
内容的提问来源于stack exchange,提问作者Frenchy35
相关产品推荐
相关产品推荐

