26

ここにPerlの簡単な質問があります:

üまたはのようなHTML特殊文字'を通常のASCIIテキストに変換するにはどうすればよいですか?

私はこのようなものから始めました:

s/\&#(\d+);/chr($1)/eg;

そして、すべてのHTML文字に対してそれを書くことができますが、このようないくつかの関数はおそらくすでに存在していますか?

完全なHTML->テキストコンバーターは必要ないことに注意してください。私はすでにHTMLを。で解析していますHTML::Parser。取得した特別な文字でテキストを変換する必要があります。

4

6 に答える 6

56

HTML ::エンティティを見てください:

use HTML::Entities;

my $html = "Snoopy & Charlie Brown";

print decode_entities($html), "\n";

あなたは出力を推測することができます。

于 2009-02-22T23:46:13.420 に答える
23

上記の回答は、エンティティを Perl 文字列にデコードする方法を示していますが、それらをASCIIに変更する方法も尋ねました。

これが本当にあなたが望むものであり、すべての Unicode 文字を必要としないと仮定すると、CPAN のText::Unidecodeモジュールを参照して、それらすべての奇妙な文字をほぼ同様の ASCII 文字のコレクションに Zap で戻すことができます。

use Text::Unidecode qw(unidecode);
use HTML::Entities qw(decode_entities);

my $source = '北亰';  
print unidecode(decode_entities($source));

# That prints: Bei Jing 
于 2009-02-26T11:18:18.863 に答える
7

16 進数指定の文字もあることに注意してください。それらは次のようになります: é (エ)。

HTML::Entities の decode_entities を使用して、エンティティを実際の文字に変換します。それを ASCII に変換するには、さらに作業が必要です。過去に、文字変換オプションをオンにして iconv (perl インターフェイス: Text::Iconv) を使用し、ある程度の成功を収めました。しかし、限られたエンティティのセットを扱っている場合、または実際に ASCII の等価物に縮小する必要がない場合は、decode_entities が生成するものを制限するか、カスタム変換マップを提供する方がよい場合があります。HTML::エンティティ ドキュメントを参照してください。

于 2009-02-23T03:11:05.173 に答える
3

いくつかの事前定義された HTML エンティティ (など)& " >があり、ハードコーディングできます。

ただし、数値エンティティのより大きなケース- は、これらの値がUnicode{であるため、はるかに難しくなり、ASCII への変換は困難から不可能までの範囲になります。

于 2009-02-22T23:47:18.050 に答える
0

I have created a one-liner for bash, using Perl to decode the HTML entities that are passed to perl. My solution is a blend of this answer (see above) and something I found on commandlinefu.com last week.

Most of us who code in Bash aren't in the habit of using echo -n to strip out the \n newline character since it doesn't usually affect Bash text parsing. With Perl——and with this particular method——it's important to use echo -n or else perl will interpret the 'newline' \n character as a literal part of the response, adding an unwanted %0A to your results.

Here's my bash-perl one-liner hybrid:

encodedURL="$(echo -n "$entityURL" | perl -MHTML::Entities -MURI::Escape -ne 'print uri_escape(decode_entities($_))')"

Example:

Input: Seals \& Croft - Summer Breeze

Output: Seals%20%26%20Croft%20-%20Summer%20Breeze

于 2022-02-05T08:37:46.590 に答える