不会在perl中自动解析所有数字的Twitter主题标签?

时间:2010-04-22 16:07:39

标签: regex perl twitter

我正在通过Twitter搜索结果制作HTML。很高兴使用Net :: Twitter模块: - )

Twitter中的一条规则是全数字主题标签不是链接。 这样就可以毫不含糊地发布“不再是我的#1”之类的内容,如下所示:http://twitter.com/natarias2007/status/11246320622

我提出的解决方案如下:

$tweet =~ s{#([0-9]*[A-Za-z_]+[0-9]*)}{<a href="http://twitter.com/search?q=%23$1">#$1</a>}g;

它似乎有效(让我们希望),但我仍然很好奇......你会怎么做?

编辑:我之前提出的正则表达式不正确! 请参阅下面的更好答案: - )

2 个答案:

答案 0 :(得分:1)

您的正则表达式不会捕获包含多个以数字分隔的字母的锚点,例如#A0A:

my @anchors = ($tweet =~ m/#(\w+)/g);
foreach my $anchor (@anchors)
{
    next unless $anchor =~ m/[a-z]/i;
    $tweet =~ s{#$anchor}{<a href="http://twitter.com/search?q=%23$anchor">#$anchor</a>}g;
}

e.g。考虑my $tweet = "hello #123 hello #abc1a hello #a0a";

您的代码生成hello #123 hello <a href="http://twitter.com/search?q=%23abc1">#abc1</a>a hello <a href="http://twitter.com/search?q=%23a9">#a0</a>a

我的生产hello #123 hello <a href="http://twitter.com/search?q=%23abc1a">#abc1a</a> hello <a href="http://twitter.com/search?q=%23a9a">#a0a</a>

答案 1 :(得分:0)

我没有意识到Twitter文本有多复杂! http://engineering.twitter.com/2010/02/introducing-open-source-twitter-text.html

我在Ruby库中发现了这些与标签相关的行,这些行在该博客文章中被链接。不太了解Ruby - 可能还有更多......

# Latin accented characters (subtracted 0xD7 from the range, it's a confusable multiplication sign. Looks like "x")
LATIN_ACCENTS = [(0xc0..0xd6).to_a, (0xd8..0xf6).to_a, (0xf8..0xff).to_a].flatten.pack('U*').freeze
REGEXEN[:latin_accents] = /[#{LATIN_ACCENTS}]+/o

# Characters considered valid in a hashtag but not at the beginning, where only a-z and 0-9 are valid.
HASHTAG_CHARACTERS = /[a-z0-9_#{LATIN_ACCENTS}]/io
REGEXEN[:auto_link_hashtags] = /(^|[^0-9A-Z&\/]+)(#|#)([0-9A-Z_]*[A-Z_]+#{HASHTAG_CHARACTERS}*)/io

我看不出单独处理“LATIN_ACCENTS”的原因。如果配置正确,\ w快捷方式应该捕获所有重音字符。也许它在Ruby中有所不同......也许他们有其他原因......

现在,我正在寻找看起来像这样的东西

$tweet =~ s{#([0-9A-Z_]*[A-Z_]+\w+)}{<a href="http://twitter.com/search?q=%23$1">#$1</a>}gi

不能说它已经解决了......