gpt4 book ai didi

perl - 如何在 Perl 中很好地格式化 URL?

转载 作者:行者123 更新时间:2023-12-01 05:08:45 26 4
gpt4 key购买 nike

我有一堆 URL 需要转换成链接:

for my $url (@url_list) {
say "<a href='$url'>$url</a>";
}

是否有使可见 URL 更好的模块?有点像这样:

http://www.foo.com/ → www.foo.comhttp://www.foo.com/long_path → www.foo.com/lo…

我知道这里可能需要一个简单的正则表达式,但我被 CPAN 宠坏了。 :)

最佳答案

RFC 2396 的附录 B指定解析 URI 引用的正则表达式。稍微调整一下以获得您想要的:

#! /usr/bin/perl

use warnings;
use strict;

use 5.10.0; # for defined-or (//)

my $uri = qr{
^
(?:([^:/?\#]+):)? # scheme = $1
(?://([^/?\#]*))? # authority = $2
([^?\#]*) # path = $3
(\?[^\#]*)? # query = $4
(\#.*)? # fragment = $5
}x;

上面的代码使用了 /x modifier

It tells the regular expression parser to ignore most whitespace that is neither backslashed nor within a character class. You can use this to break up your regular expression into (slightly) more readable parts. The # character is also treated as a metacharacter introducing a comment, just as in ordinary Perl code.

但我们想要匹配文字 # 字符(如果它们存在),这意味着我需要使用反斜杠对它们进行转义。出于习惯,我从 qr/ 开始,但由于模式中的斜杠,我不得不更改分隔符。

几个测试用例:

my @cases = qw(
ftp://www.foo.com.invalid/
http://www.foo.com.invalid/
http://www.foo.com.invalid/long_path
http://www.foo.com.invalid/?query
http://www.foo.com.invalid?query
http://www.foo.com.invalid/#fragment
http://www.foo.com.invalid#fragment
);

一点逻辑

for (@cases) {
my $nice;
if (my($scheme,$auth,$path,@rest) = /$uri/) {
if ($scheme eq "http" && defined $auth) {
if (grep defined, @rest) {
$nice = join "" => map $_ // "" => $auth, $path, @rest;
}
else {
$nice = $auth
. ($path eq "/" ? "" : $path);
}
}
else {
$nice = $_;
}
}

print "$_ → $nice\n";
}

和输出:

ftp://www.foo.com.invalid/ → ftp://www.foo.com.invalid/http://www.foo.com.invalid/ → www.foo.com.invalidhttp://www.foo.com.invalid/long_path → www.foo.com.invalid/long_pathhttp://www.foo.com.invalid/?query → www.foo.com.invalid/?queryhttp://www.foo.com.invalid?query → www.foo.com.invalid?queryhttp://www.foo.com.invalid/#fragment → www.foo.com.invalid/#fragmenthttp://www.foo.com.invalid#fragment → www.foo.com.invalid#fragment

关于perl - 如何在 Perl 中很好地格式化 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3749282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com