我正在用 PHP 构建一个 Twitter 小东西,我正在尝试解析 URL、@replies 和 #hashtags 并将它们变成可点击的链接。

  • @replies 将链接到 http://twitter.com/replies
  • Hashtags 想要 http://search.twitter.com/search?q=%23hashtags

  • 我找到了一个用于解析 URL 的类,我想知道这是否也可以用于解析 @replies 和 #hashtags:
    // http://josephscott.org/archives/2008/11/makeitlink-detecting-urls-in-text-and-making-them-links/
    class MakeItLink {
    protected function _link_www( $matches ) {
        $url = $matches[2];
        $url = MakeItLink::cleanURL( $url );
        if( empty( $url ) ) {
            return $matches[0];
        }
    
        return "{$matches[1]}<a href='{$url}'>{$url}</a>";
    }
    
    public function cleanURL( $url ) {
        if( $url == '' ) {
            return $url;
        }
    
        $url = preg_replace( "|[^a-z0-9-~+_.?#=!&;,/:%@$*'()x80-xff]|i", '', $url );
        $url = str_replace( array( "%0d", "%0a" ), '', $url );
        $url = str_replace( ";//", "://", $url );
    
        /* If the URL doesn't appear to contain a scheme, we
         * presume it needs http:// appended (unless a relative
         * link starting with / or a php file).
         */
        if(
            strpos( $url, ":" ) === false
            && substr( $url, 0, 1 ) != "/"
            && !preg_match( "|^[a-z0-9-]+?.php|i", $url )
        ) {
            $url = "http://{$url}";
        }
    
        // Replace ampersans and single quotes
        $url = preg_replace( "|&([^#])(?![a-z]{2,8};)|", "&#038;$1", $url );
        $url = str_replace( "'", "&#039;", $url );
    
        return $url;
    }
    
    public function transform( $text ) {
        $text = " {$text}";
    
        $text = preg_replace_callback(
            '#(?<=[\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#$%&~/\-=?@\[\](+]|[.,;:](?![\s<])|(?(1)\)(?![\s<])|\)))*)#is',
            array( 'MakeItLink', '_link_www' ),
            $text
        );
    
        $text = preg_replace( '#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $text );
        $text = trim( $text );
    
        return $text;
    }
    }
    

    最佳答案

    我认为您要做的基本上就是我在下面列出的内容。您将在 transform 方法中添加这两个语句,就在 return 语句之前。

    $text = preg_replace('#@(\w+)#', '<a href="http://twitter.com/$1">$0</a>', $text);
    $text = preg_replace('/#(\w+)/', '<a href="http://twitter.com/search?q=%23$1&src=hash">$0</a>', $text);
    

    这就是你要找的吗?

    10-08 16:28