Преобразование твитов в виде простого текста для включения гиперссылок - PullRequest
0 голосов
/ 26 июня 2019

Я экспортировал свои данные из Twitter, чтобы включить свои твиты в свой личный блог.У меня есть каждый твит за последние 10 лет в виде обычного текста.Вот пример:

When a new startup enters your industry and innovates around you, winning your customers and taking your revenues, if you fail to transform your own business in response, are you negligent? Do shareholders have a claim against you? https://myurl.com/blah #Governance #liability #corporatenegligence

Я хочу обработать каждый твит и добавить теги привязки HTML к любым URL-адресам и тегам, найденным в тексте.Таким образом, все, что с http / https, превращается в ссылку, а все, что содержит хеш, прежде чем превращается в ссылку.

Я пытаюсь найти регулярное выражение для этого.Якорный тег для URL просто использует сам URL в качестве href.Href для тегов: https://twitter.com/hashtag/TAG, где TAG - это текст тега после # и перед не алфавитно-цифровым символом.

Каждый твит хранится в массиве скаляров, который называется @tweets.Так что проходить по ним прямо вперед.

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Звучит так, что некоторые довольно простые регулярные выражения будут полезны.

Ссылка - "http://" или" https://", за которой следует ряд непробельных символов - https?://S+.

Хэштегом является хеш, за которым следует ряд буквенно-цифровых символов - #\w+.

Итак, код может выглядеть примерно так:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

$_ = join '', <DATA>;

# Before
say;

# Convert links
s|(https?://\S+)|<a href="$1">$1</a>|g;

# Convert hashtags
s|#(\w+)|<a href="https://twitter.com/hashtag/$1">#$1</a>|g;

# After
say;

__DATA__
When a new startup enters your industry and innovates around you, winning
your customers and taking your revenues, if you fail to transform your own
business in response, are you negligent? Do shareholders have a claim against
you? https://myurl.com/blah #Governance #liability #corporatenegligence
1 голос
/ 26 июня 2019

Попробуйте URL :: Поиск . Он будет обрабатывать многие крайние случаи, такие как URL-адреса, сопровождаемые или окруженные пунктуацией:

use strict;
use warnings;
use URL::Search '$URL_SEARCH_RE';

$text =~ s{($URL_SEARCH_RE)}{<a href="$1">$1</a>}g;

Но есть и другая проблема. URL-адреса и окружающий текст должны быть экранированы HTML, если вы хотите использовать результат как HTML, но вы, конечно, не хотите экранировать HTML от вашего действительного HTML. Чтобы решить эту проблему, вы можете разбить строку на разделы URL и не-URL, экранировать оба и обернуть URL-адреса, а затем соединить их вместе. К счастью, URL :: Search имеет функцию partition_urls, предназначенную именно для этого.

use strict;
use warnings;
use utf8;
use URL::Search 'partition_urls';
use HTML::Entities;

my $text = do { local $/; <DATA> };

my $output = '';
foreach my $section (partition_urls $text) {
  my $escaped = encode_entities $section->[1];
  if ($section->[0] eq 'URL') {
    $output .= qq{<a href="$escaped">$escaped</a>};
  } else {
    $escaped =~ s{(?<!\S)#([a-zA-Z0-9]+)}{<a href="https://twitter.com/hashtag/$1">#$1</a>}g;
    $output .= $escaped;
  }
}

print $output;

__DATA__
When a new startup enters your industry and innovates around you, winning
your customers and taking your revenues, if you fail to transform your own
business in response, are you negligent? Do shareholders have a claim against
you? https://myurl.com/blah #Governance #liability #corporatenegligence

Существует еще одно осложнение, заключающееся в том, что для использования в URL хэштеги должны быть экранированы URI, до экранирования HTML, но ограничение того, что разрешено в хэштегах, ASCII-буквами и цифрами [a-zA-Z0-9] позволяет избежать этого проблема ... Альтернативой является то, что вам нужно снова разделить разделы без URL на хэштеги и текст без хэштега для отдельной обработки.

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