替换preg_match的第一场比赛?

时间:2013-06-13 15:21:12

标签: preg-replace preg-match

我有这样一个永久链接:

example.com/cyclone/2013/06/05/introduction/

此帖属于“旋风”和“天气”这两个类别,但“旋风”正在接替这个固定链接。

我需要检查是否为此帖子分配了“天气”,然后重写永久链接。

if( in_array( 'weather', $cats ) ) {
        $pattern = '#([^/]+)/(\d{4})/(\d{2})/(\d{2})/([^/]+)/?#';
        if( preg_match( $pattern, $permalink, $matches ) ) {
            if( $matches[1] && $old_cat = get_category_by_slug( $matches[1] ) && 'weather' !== $matches[1] ) {
                preg_replace( '/' . $matches[1] . '/', $new_cat, $permalink );
                return $permalink;
            }
        }
    }

不幸的是,$ matches [1]不是preg_replace中使用的有效“模式”。如何替换preg_match的第一个匹配?

1 个答案:

答案 0 :(得分:0)

尝试使用preg_replace_callback函数:

$permalink = preg_replace_callback('~[^/]++(?=\d{4}/\d{2}/\d{2}/[^/]++)~',
    function ($m) use ($new_cat, $old_cat) {
        if ($old_cat == get_category_by_slug($m[0]) && 'weather' !== $m[0])
            return $new_cat;
    },
    $permalink);

请注意, preg_replace preg_replace_callback 不会更改主题字符串,但会返回修改后的字符串。