我有以下代码解析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()
答案 0 :(得分:3)
您的代码中存在两个问题:
在PHP中,您将字符串与.
连接在一起,而不是与+
连接。使用+
时,PHP会在添加字符串之前将字符串转换为整数,从而生成0
。
在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);
答案 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>