Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将纯文本推文转换为包含超链接_Regex_Perl - Fatal编程技术网

Regex 将纯文本推文转换为包含超链接

Regex 将纯文本推文转换为包含超链接,regex,perl,Regex,Perl,我已经从Twitter上导出了我的数据,以便将我的推文包含在我的个人博客上。我有过去10年的每一条推特都是纯文本的。例如: 当一家新的创业公司进入你的行业并在你周围进行创新,赢得你的客户并拿走你的收入时,如果你没有相应地改变自己的业务,你是否疏忽了?股东对你有要求吗?https://myurl.com/blah #治理#责任#公司智能 我想处理每条推文,并将HTML锚定标记添加到文本中找到的任何URL和标记中。所以基本上,任何带有http/https的东西都会变成链接,任何带有哈希的东西在变成链

我已经从Twitter上导出了我的数据,以便将我的推文包含在我的个人博客上。我有过去10年的每一条推特都是纯文本的。例如:

当一家新的创业公司进入你的行业并在你周围进行创新,赢得你的客户并拿走你的收入时,如果你没有相应地改变自己的业务,你是否疏忽了?股东对你有要求吗?https://myurl.com/blah #治理#责任#公司智能

我想处理每条推文,并将HTML锚定标记添加到文本中找到的任何URL和标记中。所以基本上,任何带有http/https的东西都会变成链接,任何带有哈希的东西在变成链接之前都会变成链接

我正在努力想出一个正则表达式来实现这一点。URL的锚定标记只使用URL本身作为href。标签上的href是其中标签是在#之后、非字母数字字符之前的标签文本


每个tweet都存储在一个称为
@tweets
的标量数组中。所以循环使用它们是很简单的。

听起来一些非常基本的正则表达式会很有用

链接是“http://”或“https://”,后跟一系列非空白字符-
https?://S+

hashtag是一个哈希,后跟一系列字母数字字符-
\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
#/usr/bin/perl
严格使用;
使用警告;
使用特征“说”;
$\连接“”;
#以前
说,;
#转换链接
(https?:/\s+)| g;
#转换哈希标记
s |#(\w+)| | g;
#之后
说,;
__资料__
当一家新的创业公司进入你的行业并在你周围进行创新时,你就会获胜
如果你不能改变你自己,你的客户和你的收入
作为回应,你是否疏忽大意?股东有权要求赔偿吗
你呢?https://myurl.com/blah #治理#责任#公司智能
试试看。它将处理许多边缘情况,如URL后跟或由标点符号包围:

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

$text =~ s{($URL_SEARCH_RE)}{<a href="$1">$1</a>}g;
使用严格;
使用警告;
使用URL::搜索“$URL\u Search\u RE”;
$text=~s{($URL\u SEARCH\u RE)}{}g;
但还有另一个问题。如果您想将结果作为HTML使用,URL和周围的文本必须是HTML转义的,但是您当然不想HTML转义您的有效HTML。要解决这个问题,您可以将字符串拆分为URL和非URL部分,转义两者并包装URL,然后将它们重新连接在一起。幸运的是,URL::Search有一个专门为此设计的分区URL函数

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
使用严格;
使用警告;
使用utf8;
使用URL::搜索“分区\ URL”;
使用HTML::实体;
my$text=do{local$/;};
我的$output='';
foreach my$节(分区\u URL$文本){
my$Escape=encode_entities$section->[1];
如果($section->[0]eq'URL'){
$output.=qq{};
}否则{
$escaped=~s{(?)?

还有一个更复杂的问题是,在HTML转义之前,必须对哈希标记进行URI转义才能在URL中使用,但将哈希标记中允许的内容限制为ASCII字母和数字
[a-zA-Z0-9]
避免了这个问题……另一种选择是,您必须将非URL部分再次拆分为哈希标记和非哈希标记文本,以进行单独处理。

您尝试了什么?您遇到了什么问题?请向我们展示您的代码。只需将每个标量按空格拆分,然后与正则表达式一起检查http+https+#+字符串,并替换这些strings?@Chris:在空白处分裂似乎是一个不必要的复杂问题。这真是一种享受——非常感谢:)