1

我打算从包含许多以“%xx”形式表示的 unicode 字符的网页中提取内容。当我使用 Perl 模块 LWP 来获取网页时,自然会使用 Perl Regex 处理这些 un​​icode 字符,如下所示。

my $html = "%20%26%40 ";
$html =~ s#%([0-9a-f]+)#\x{\1}#ig;
print "$html\n";

但是上面的代码不起作用,它只输出“00”。现在卡住......任何提示将不胜感激。

谢谢,叶

4

4 回答 4

8

URI::EscapePerl 已经为此在模块中内置了函数。你不需要弄乱正则表达式

use URI::Escape;
my $encode = uri_unescape($string);

有关更多信息,请参阅此页面

于 2012-08-27T14:56:40.397 回答
2

你需要一个可执行的替换

$html =~ s/%([0-9a-f]+)/chr hex $1/ieg;

但最好使用该URI::Escape模块,它是 Gisle Aas 出色的 LWP 套件的一部分

于 2012-08-27T15:05:12.493 回答
0

首先,这与 HTML 无关。URI 使用该转义机制。

您必须这样做似乎真的很奇怪。通常唯一需要撤消该编码的是 CGI 脚本接收参数,在这种情况下,您只需要

use CGI;
my $cgi = CGI->new();
my $foo = $cgi->param('foo');

但是,假设您需要进行自己的 URI 解析。你可以使用:

use URI;
my %form = URI->new($url)->query_form();
my $foo = $form{'foo'};

图形接口_

于 2012-08-27T15:46:50.237 回答
-1

有趣而丑陋的代码:

my $html = "%20%26%40 ";
$html =~ s#%([0-9a-f]{2})#"chr(0x$1)"#igee;
print "$html\n";

编辑:(我不得不说)这段代码可能很可爱,但不要在生产中使用它!(有很多情况下它不起作用)

于 2012-08-27T14:57:23.630 回答