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

标签 php regex twitter hashtag

我正在编写一个小的 PHP 脚本来从用户提要中获取最新的 6 个 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 不是。在互联网上进行了一些检查并尝试了各种标签后,我得出的结论是,主题标签必须在某处包含字母字符或下划线才能构成链接;只有数字字符的标签会被忽略(大概是为了阻止诸如“鲍勃的演讲很好,幻灯片 #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;
?>

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

最佳答案

(^|\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 <- 在这里测试。

关于php - 正则表达式有条件地用超链接替换 ​​Twitter 主题标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4277070/

相关文章:

php - 如何使用php仅从上传到mysql的电子邮件中捕获电子邮件

regex - 计算一个字符串在另一个字符串中出现的次数(Perl)

即使在困惑的字符串中也能找到 YYYY-MM 的 Java 正则表达式

twitter - 为什么在元组上使用 Some 会将类型包装在 &[] 中?

php - html 输入=服务器

php - 编码标准 : Large amount of arguments

javascript - 意外的标记 < PHP 中的 Javascript 代码

c - PCRE 开放式范围和部分匹配

twitter - 如何在本地测试twitter API?

twitter - 值 registerAsTable 不是 org.apache.spark.rdd.RDD[Tweet] 的成员