【问题标题】:Find URLs, @replies and #hashtags from Tweets从推文中查找 URL、@replies 和 #hashtags
【发布时间】:2009-07-21 12:53:07
【问题描述】:

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

我找到了一个解析 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;
}
}

【问题讨论】:

  • 这里有问题吗?这段代码有问题吗?
  • 是的,这个类只解析链接,我也想解析@replies和#hashtags并把它们变成链接

标签: php regex text twitter


【解决方案1】:

我认为您想要做的基本上就是我在下面包含的内容。您可以在 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);

这就是你要找的吗?

【讨论】:

  • 我喜欢这个实现的简单性。更正!
  • 嗨@SoaperGEM,这不考虑主题标签中的特殊字符,例如,它不适用于#Prévoyance 之类的词。任何解决方法?
【解决方案2】:

Twitter recently released 开源 javaruby (gem) 代码实现,用于查找用户名、哈希标签、列表和 URL。

它非常面向正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 2013-10-12
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多