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

如何让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);

                }
            }
            
        }
    
}
解决方案

要获取单个一维匹配结果,可按以下方式调整代码:

核心修改思路

  1. 找到匹配后立即终止循环:一旦找到符合条件的匹配项,跳出所有相关循环,避免无效遍历。
  2. 提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:50:26