在引用推文时解析推特链接中断



我有以下代码,它解析推文以将链接,提及和哈希转换为链接:

function parseTwitterText($text) {
    $returnText = $text;
    $hashPattern = '/#([A-Za-z0-9_]+)/i';
    $mentionPattern = '/@([A-Za-z0-9_]+)/i';
    $urlPattern = '/(http[s]?://[^s]+)/i';
    $robotsFollow = false;
    // SCAN FOR LINKS FIRST!!! Otherwise it will replace the hashes and mentions
    $returnText = preg_replace($urlPattern, '<a href="$1" ' . (($robotsFollow)? '':'rel="nofollow"') . '>$1</a>', $returnText);
    $returnText = preg_replace($hashPattern, '<a href="http://twitter.com/#!/search?q=%23$1" ' . (($robotsFollow)? '':'rel="nofollow"') . '>#$1</a>', $returnText);
    $returnText = preg_replace($mentionPattern, '<a href="http://twitter.com/$1" ' . (($robotsFollow)? '':'rel="nofollow"') . '>@$1</a>', $returnText);
    return $returnText;
}

但是,如果我有一条推文,例如:

“@WOWPicsOfLife: Tickling a turtle. http://t.co/rqHVQvhqdO”

结果将是:

“<a href="http://twitter.com/WOWPicsOfLife" rel="nofollow">@WOWPicsOfLife</a>: Tickling a turtle. <a href="http://t.co/rqHVQvhqdO”" rel="nofollow">http://t.co/rqHVQvhqdO”</a>

因此,如您所见,它将最后一个引号添加到最后一个链接中(这显然会破坏它)。

我假设这是因为报价在链接旁边,并且因为它在末尾没有空格,它会将其与链接联系起来......问题是我如何解决这样的事情?也许是对正则表达式的修正以忽略引号?

关键当然在于你的

  $urlPattern = '/(http[s]?://[^s]+)/i';

特别是在[^s]+中,它说每个不是"空格"的字符都是URL的一部分。您需要将其限制为"安全"字符列表,这些字符肯定是URL的一部分。我认为这不能用正则表达式完全完全 URL 安全完成,但你可以通过这种方式强烈缓解问题。

另请参阅此问题:URL 中允许的字符。

最新更新