我正在编写一个小的PHP脚本,以获取从用户feed的最新六个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;
?>

有用;但是对于它的作用似乎相当长。我的问题是,是否有一个类似于我从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 < - 在这里测试。

其他提示

实际上,最好搜索在主题标签中不允许的字符,否则“#trentemøller”等标签将无法使用。

以下对我有好处...

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

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

我找到了瞪羚 回答 为了工作,尽管正则正则在主题标签的开头增加了一个空白空间,所以我删除了第一部分:

(^|\s)

现在,这对我来说是完美的:

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

示例在这里: http://rubular.com/r/ds2qyzp45n

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top