не связывать все числовые хэштеги твиттера в perl? - PullRequest
2 голосов
/ 22 апреля 2010

Я создаю HTML из результатов поиска Twitter. Счастливо используя модуль 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 ]

1 голос
/ 22 апреля 2010

Ваше регулярное выражение не будет захватывать якоря, содержащие более одной буквы, разделенные цифрами, например, # А0А:

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;
}

например. рассмотрим 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>

0 голосов
/ 27 апреля 2010

Я не осознавал, насколько сложен текст в твиттере! http://engineering.twitter.com/2010/02/introducing-open-source-twitter-text.html

Я нашел эти строки, связанные с хэштегом, в библиотеке 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

Не могу сказать, что это еще решено ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...