使用PHP preg_replace解析Twitter文本

时间:2013-12-15 19:37:04

标签: javascript php twitter

我有以下代码解析Twitter文本以将链接,提及和散列更改为超链接:

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;
}

但是,如果我发送了0

这样的推文,我就会回复#test

我将此代码基于我的JavaScript版本,所以想知道我是否在preg_replace()中做了一些错误,只能在JS replace()

中工作

2 个答案:

答案 0 :(得分:3)

您的代码中存在两个问题:

  1. 在PHP中,您将字符串与.连接在一起,而不是与+连接。使用+时,PHP会在添加字符串之前将字符串转换为整数,从而生成0

  2. preg_replace()调用中,您不必转义第二个参数中的所有字符。因此,删除这三行中的所有反斜杠。

  3. 你应该得到这样的东西:

    $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);
    

答案 1 :(得分:2)

在PHP中,您使用.concatenate两个字符串,而不是+,就像在JavaScript中一样。另外,正如BluePsyduck所提到的,你不必像现在这样逃避所有角色。

更改preg_replace()语句,如下所示:

$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);

测试:

header('Content-Type: text/plain');
echo parseTwitterText('@foo lala');
echo parseTwitterText('#test');

输出:

<a href="http://twitter.com/foo" rel="nofollow">@foo</a> lala
<a href="http://twitter.com/#!/search?q=%23test" rel="nofollow">#test</a>

Demo.