正则表达式有条件地用超链接替换Twitter主题标签

时间:2010-11-25 12:28:51

标签: php regex twitter hashtag

我正在编写一个小的PHP脚本,从用户提要中获取最新的六个Twitter状态更新,并将其格式化以便在网页上显示。作为其中的一部分,我需要一个正则表达式替换重写主题标签作为search.twitter.com的超链接。最初我尝试使用:

<?php
$strTweet = preg_replace('/(^|\s)#(\w+)/', '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', $strTweet);
?>

(摘自https://gist.github.com/445729

在测试过程中,我发现#test被转换为Twitter网站上的链接,但#123不是。在对互联网进行了一些检查并使用各种标签后,我得出的结论是,标签必须包含字母字符或其中的下划线以构成链接;只有数字字符的标签会被忽略(大概是为了阻止“Good presentation Bob,幻灯片#3是我最喜欢的!”之类的东西)。这使得上面的代码不正确,因为它很乐意将#123转换为链接。

我暂时没有做太多的正则表达式,所以在我的生锈中我提出了以下PHP解决方案:

<?php
$test = 'This is a test tweet to see if #123 and #4 are not encoded but #test, #l33t and #8oo8s are.';

// Get all hashtags out into an array
if (preg_match_all('/(^|\s)(#\w+)/', $test, $arrHashtags) > 0) {
  foreach ($arrHashtags[2] as $strHashtag) {
    // Check each tag to see if there are letters or an underscore in there somewhere
    if (preg_match('/#\d*[a-z_]+/i', $strHashtag)) {
      $test = str_replace($strHashtag, '<a href="http://search.twitter.com/search?q=%23'.substr($strHashtag, 1).'">'.$strHashtag.'</a>', $test);
    }
  }
}

echo $test;
?>

有效;但它似乎相当长篇大论。我的问题是,是否有一个类似于我从gist.github获得的preg_replace,只有当它们不包含数字时才会有条件地将主题标记重写为超链接?

4 个答案:

答案 0 :(得分:23)

(^|\s)#(\w*[a-zA-Z_]+\w*)

PHP

$strTweet = preg_replace('/(^|\s)#(\w*[a-zA-Z_]+\w*)/', '\1#<a href="http://twitter.com/search?q=%23\2">\2</a>', $strTweet);

这个正则表达式表示#后跟0个或多个字符[a-zA-Z0-9_],后跟字母字符或下划线(1个或更多个),后跟0个或多个单词字符。

http://rubular.com/r/opNX6qC4sG&lt; - 在此测试。

答案 1 :(得分:1)

实际上,搜索标签中不允许的字符会更好,否则像“#Trentemøller”这样的标签将不起作用。

以下适用于我......

preg_match('/([ ,.]+)/', $string, $matches);

答案 2 :(得分:0)

我设计了这个:/(^|\s)#([[:alnum:]])+/gi

答案 3 :(得分:0)

我找到了Gazlers answer,虽然正则表达式在标签的开头添加了一个空格,所以我删除了第一部分:

(^|\s)

这对我来说非常适合:

#(\w*[a-zA-Z_0-9]+\w*)

此处示例:http://rubular.com/r/dS2QYZP45n