2017-05-03 13 views
2
#!/usr/bin/perl -T 
use strict; 
use warnings; 
use utf8; 
my $s = shift || die; 
$s =~ s/[^A-Za-z ]//g; 
print "$s\n"; 
exit; 

> ./poc.pl "El Guapö" 
El Guap 

このPerlコードを変更して、さまざまなウムラウトや文字アクセントを取り除く方法はありますか?ありがとう!直接の質問についてはストリップ文字列だがウムラウトを許可する

+2

確かに、それらを文字クラスに追加しますか? – sln

+0

保存しますか?漢字? – melpomene

+1

アクセントの組み合わせに気をつけますか?例えば。 LATIN SMALL LETTER OとCOMBINING DIAERESISがある場合は、両方を保持しますか? – melpomene

答えて

7

、あなたは単に、すべての入力と出力のエンコード、しかし、もっと重要なデコードを\p{L}(レター)Unicode Character Property

が必要な場合があります。   script.pl 123 El Guapö=_

 
Input:  123 El Guapö=_ 
Processed: El Guapö 

として実行すると、具体的な説明が欠けているように私は、 "ブランケット" \p{L}プロパティ(レター)を使用しました

use warnings; 
use strict; 
use feature 'say'; 

use utf8; # allow non-ascii (UTF-8) characters in the source 

use open ':std', ':encoding(UTF-8)'; # for standard streams 

use Encode qw(decode_utf8);   # @ARGV escapes the above 

my $string = 'El Guapö'; 
if (@ARGV) { 
    $string = join ' ', map { decode_utf8($_) } @ARGV; 
} 
say "Input:  $string"; 

$string =~ s/[^\p{L} ]//g; 

say "Processed: $string"; 

。必要に応じて調整してください。 Unicodeのプロパティは多くのものを提供しています。上のリンクと完全リストはperlunipropsです。

123 Elの間のスペースが残っています。最後にはストリップの先頭(および末尾)のスペースが残っています。

また、\P{L}もあります。大文字のPは否定を示します。


マークが同様に削除されるように、上記の単純な志向\pLは、Combining Diacritical Marksでは動作しません。これを指摘してくれたjm666に感謝します。

アクセント付きの「論理」文字(単一の文字として表示されるもの)が、そのベース文字と非スペースマーク(アクセント記号)のために別々の文字を使用して書き込まれるときに発生します。多くの場合、コードポイントを持つ1文字(extended grapheme cluster)も存在します。

例:niñoñU+OOF1ですが、それはまた"n\x{303}"のように記述することができます。このように書かれたアクセントが文字クラスに\p{Mn}\p{NonspacingMark})を追加

my $string = "El Guapö=_ ni\N{U+00F1}o.* nin\x{303}o+^"; 
say $string; 

(my $nodiac = $string) =~ s/[^\pL ]//g;  #/ naive, accent chars get removed 
say $nodiac; 

(my $full = $string) =~ s/[^\pL\p{Mn} ]//g; # add non-spacing mark 
say $full; 

出力

 
El Guapö=_ niño.* niño+^ 
El Guapö niño nino 
El Guapö niño niño 

保つために

だから、組み合わせアクセントを保つためにs/[^\p{L}\p{Mn} ]//gをしたいです。

+1

@ jm666コメントありがとうございます。私はOPがあまり言わないので、正確な正規表現にはあまり関心がありませんでした - そして、残りは本当に重要だと思っていました。あなたは正しいですが、文字クラスに '\ pM'をスローする必要があります。 – zdim

+0

多少なりとも分かります。私の最終的な目的は、CGIの入力を取り除き、MySQLに保存してから、HTMLで検索して使用することです。私の混乱はデコード/エンコードにあります。デコードされた値をデータベースに格納し、使用する前にエンコードするのは適切ですか?私は、顧客が現在取り残している不器用なものに適切に対応する必要があります。ありがとう! –

+0

@TimothyB。あなたはそれを後方に持っています。データベースに保存する前に* en *コードを作成し、再度コードを取り出すときに* de *コードを記述する必要があります。 DBIを使用していて、データベースとデータベースハンドルが正しく設定されている場合は、これが実行されます。 –

関連する問題