PREG_REPLACE_CALLBACK中的STRTOLOWER无法使用#hashtag链接

时间:2014-08-24 18:14:55

标签: php hashtag lowercase preg-replace-callback

出于某种原因,我无法为我的生活,使用链接到#Hashtag的锚标记正确地使用strtolower ...甚至使用preg_replace_callback()。

public static function convertHashtags($str) {
    $str = preg_replace_callback(
                    '/(\#([a-z0-9_]+))/ix', 
                    function( $matches ) {
                        $uri = strtolower($matches[2]);
                        // return $uri;
                        return '<a href="'. SITE_URL .'/hashtag/'. $uri .'">'. $matches[1] .'</a>';
                    }, $str, -1);
    return $str;
}

所有这一切需要抓住#hashtag并将其转换为链接。当#HashTag保留原始格式时,网址需要小写。

示例:

#Palladia turns into:
<a href="/hashtag/palladia">#Palladia</a>

然而,我注意到一些不可思议的东西......如果我在回报中加上一个#,就在$ match [1]之前它运行正常,但显然会显示2#。所以我想,好吧,我只是在前面使用$ match [2]和#。不,不行。无论出于何种原因,它需要#Palladia前面的额外#...这导致不太理想的结果:

<a href="/hashtag/palladia">##Palladia</a>

奇怪的是,如果我只是返回strotolower($ matches [2]),它会将字符串小写...它只是不想在锚标记内部工作。 有没有人知道如何制作它所以我不需要额外的#那里?

1 个答案:

答案 0 :(得分:2)

我认为混淆来自$matches中的内容 - 你有两组括号,但实际上只需要一个在主题标签后捕获文本。

我稍微简化了代码:

public static function convertHashtags($str) {

    return preg_replace_callback(
        '/#([\w]+)/',  // all "word" characters, all digits, and underscore
                       // brackets around the string AFTER the hashtag
        function( $matches ) {
            // $matches[0] is the complete match (including the hashtag)
            // $matches[1] is the match for the subpattern enclosed in brackets
            return '<a href="'. SITE_URL .'/hashtag/'
                . strtolower($matches[1]) .'">'
                . $matches[0] .'</a>';
        }, $str);
}

convertHashtags('#Palladium')
// output: <a href="SITE_URL/hashtag/palladium">#Palladium</a>

还适用于包含多个主题标签的文本:

convertHashtags("I love #StackOverflow and #Hashtags. They're awesome! #Awesomesauce");
// output:  I love <a href="SITE_URL/hashtag/stackoverflow">#StackOverflow</a> and
//          <a href="SITE_URL/hashtag/hashtags">#Hashtags</a>. They're awesome! <a
//          href="SITE_URL/hashtag/awesomesauce">#Awesomesauce</a>