首页 > 解决方案 > 计数我做了一个 preg_replace 我通过字典运行匹配并将其用作放置的项目?

问题描述

我想做一个正则表达式来查找$startDate. 因此,如果月份是 11 Mei 2020,我想用 05 替换 Mei。我想match[0]通过字典来获取正确的对应数字来做到这一点。我怎样才能做到这一点?

function doGetEarliestUpcomingDate($today, $dates)
    {
        foreach($dates as $date)
        {   
            $startDate = $date['startdatum'];
            preg_replace('/ (.*?) /', this.do_dutch_month_name_to_number($match[0]),  $startDate);
        }
    }

    function doDutchMonthNameToNumber($monthName){
        $monthName = strtolower($monthName);
        $monthDictionary = array(
            'januari' => '01',
            'februari' => '02',
            'maart' => '03',
            'april' => '04',
            'mei' => '05',
            'juni' => '06',
            'juli' => '07',
            'augustus' => '08',
            'september' => '09',
            'oktober' => '10',
            'november' => '11',
            'december' => '12',
        );
        return $monthDictionary[$monthName];
    }

标签: phpregex

解决方案


如果您只想替换匹配项,您可以使用\K忘记当前匹配的内容,并使用正向前瞻(?=来确保\h+后面有一个水平空格和 4 位数字。

\b\d+\h+\K[a-z]+(?=\h+\d{4})\b

正则表达式演示| php演示

使用preg_replace_callback,您可以将单个匹配添加到函数中doDutchMonthNameToNumber

例如

$replaced = preg_replace_callback('/\b\d+\h+\K[a-z]+(?=\h+\d{4})\b/i', function($matches){
    return $this->doDutchMonthNameToNumber($matches[0]);
}, $startDate);
echo $replaced; // 11 05 2020

除了使用\K,您还可以使用捕获组并将第二个捕获组添加$matches[2]到函数中。

\b(\d+\h+)([a-z]+)(\h+\d{4})\b

正则表达式演示| php演示


推荐阅读