2012-08-27 33 views
1

我打算從一個包含許多以「%xx」形式表示的unicode字符的網頁中提取內容。正如我使用Perl模塊LWP來獲取網頁,自然使用Perl Regex處理這些unicode字符如下。如何在HTML中使用Perl轉換字符「%xx」

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

但上面的代碼不工作,它只輸出「00」。現在卡住... 任何提示將不勝感激。

感謝,葉

+0

這是URI編碼,不是Unicode。 – Spudley

+0

你確定'[0-9a-f] +'是否是正確的表達方式?每個令牌的URI編碼將始終有2個十六進制數字。所以'%2012'應該顯示爲'「12」',而不是'\ x {2012}'。 – mob

+0

剛纔,添加了標籤URI。 – thinkhy

回答

8

Perl有內置的URI::Escape模塊中本已功能。你並不需要亂用正則表達式

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

更多

+0

-1。我沒有看到這會有用。在對組件使用'uri_unescape'之前,你需要解析url - 你不能在整個url上使用'uri_unescape' - URL解析器應該爲你隱藏組件。 OP顯然不寫URL解析器(因爲他認爲他在處理HTML),所以你的建議會給出不正確的結果。 – ikegami

-1

滑稽和醜陋的代碼見this page

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

編輯:(我有義務說)這個代碼是也許可愛,但不要在生產中使用此! (有許多情況下,它不工作)

+0

更難看,也更規範:'s#...#chr hex $ 1#ige' – mob

+1

是的,但我忍不住要使用'/ ee' regexp屬性:p –

+0

無論如何,它們都可以工作。首先讓代碼可行,然後讓代碼變得美麗:-)謝謝。 – thinkhy

2

你需要一個可執行替代

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

但最好是使用URI::Escape模塊,這是伊斯勒阿斯優秀LWP套件的一部分

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

CGIURI

相關問題