#!/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コードを変更して、さまざまなウムラウトや文字アクセントを取り除く方法はありますか?ありがとう!直接の質問についてはストリップ文字列だがウムラウトを許可する
#!/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コードを変更して、さまざまなウムラウトや文字アクセントを取り除く方法はありますか?ありがとう!直接の質問についてはストリップ文字列だがウムラウトを許可する
、あなたは単に、すべての入力と出力のエンコード、しかし、もっと重要なデコードを\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
をしたいです。
@ jm666コメントありがとうございます。私はOPがあまり言わないので、正確な正規表現にはあまり関心がありませんでした - そして、残りは本当に重要だと思っていました。あなたは正しいですが、文字クラスに '\ pM'をスローする必要があります。 – zdim
多少なりとも分かります。私の最終的な目的は、CGIの入力を取り除き、MySQLに保存してから、HTMLで検索して使用することです。私の混乱はデコード/エンコードにあります。デコードされた値をデータベースに格納し、使用する前にエンコードするのは適切ですか?私は、顧客が現在取り残している不器用なものに適切に対応する必要があります。ありがとう! –
@TimothyB。あなたはそれを後方に持っています。データベースに保存する前に* en *コードを作成し、再度コードを取り出すときに* de *コードを記述する必要があります。 DBIを使用していて、データベースとデータベースハンドルが正しく設定されている場合は、これが実行されます。 –
確かに、それらを文字クラスに追加しますか? – sln
保存しますか?漢字? – melpomene
アクセントの組み合わせに気をつけますか?例えば。 LATIN SMALL LETTER OとCOMBINING DIAERESISがある場合は、両方を保持しますか? – melpomene