2013-05-09 10 views
6

Używam listadmin do zarządzania wieloma listami adresowymi opartymi na listach. Mam długą listę tematów i adresów skonfigurowanych do blokowania spamu. Niedawno otrzymał inteligentniejsze spamu w tym sensie, że wykorzystuje ładną znaków Unicode, np:Perl: Jak dopasować FULLWIDTH LATIN SMALL

Temat: Al l ad ULT mov y ty”ve zobaczyć nCzy nic c ompari- ng do naszej Exx xci ti ng kompilacja 13 000 mov mov ies w HD t h są dostępne dla ciebie teraz!

lub

Temat: HD qua świeci y vi d EOS z d pho na wykresie s o f ho tc hic ks
są tutaj u

Teraz chcę użyj sprytnego wyrażenia Perla, aby to zablokować. Rurowanie tych obiektów do heksowego dysku ujawniło wiele znaków: FULLWIDTH LATIN SMALL LETTER. Jednak \p{FULLWIDTH LATIN SMALL LETTER} nie działa: Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

Pytanie brzmi: czy istnieje \p{something}, aby dopasować te znaki o pełnej szerokości? Alternatywnie: czy istnieje inny sposób na dopasowanie tych znaków?

Odpowiedz

8

Strona dostępnych klas znaków Unicode. Znalazłem to jako odnośnik w perlrebackslash, który dokumentuje specjalne klasy znaków i sekwencje ukośników odwrotnych, takie jak \p{...} w wyrażeniach regularnych.

Podsumowanie jest takie, że wszystkie oprócz najbardziej typowych klas właściwości wymagają typu właściwości i wartości właściwości, które są oddzielone : lub =. Jednak nie ma wzmianki o pełnowymiarowych znakach jako predefiniowanej właściwości.

Ale jest własnością Block/Blk, które mogą mieć Halfwidth and Fullwidth Forms (U+FF00 - U+FFEF) jako wartości:

/\p{Block=Halfwidth and Fullwidth Forms}/ 

To będzie pasował na wejściu (testowane na v16.3).


Przydatnym narzędziem do tego jest uniprops.

$ uniprops U+FF41 
U+FF41 ‹a› \N{FULLWIDTH LATIN SMALL LETTER A} 
    \w \pL \p{LC} \p{L_} \p{L&} \p{Ll} 
    All Any Alnum Alpha Alphabetic Assigned InHalfwidthAndFullwidthForms 
    Cased Cased_Letter LC Changes_When_Casemapped CWCM 
    Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT 
    Changes_When_Uppercased CWU Ll L Gr_Base Grapheme_Base Graph GrBase 
    Halfwidth_And_Fullwidth_Forms Hex XDigit Hex_Digit ID_Continue IDC 
    ID_Start IDS Letter L_ Latin Latn Lowercase_Letter Lower Lowercase 
    Print Word XID_Continue XIDC XID_Start XIDS X_POSIX_Alnum 
    X_POSIX_Alpha X_POSIX_Graph X_POSIX_Lower X_POSIX_Print X_POSIX_Word 
    X_POSIX_XDigit 

Jak widać, \p{Block=Halfwidth and Fullwidth Forms} może być również napisany \p{In Halfwidth and Fullwidth Forms}.

+0

Dziękujemy @ikegami za pouczającą edytować i zabawny modułu on połączony. – amon

+0

To jedna z tchristów. 'unichars' może być użyty do odwrotu. na przykład 'unichars -au '\ p {InHalfwidthAndFullwidthForms}'' wyświetla znaki w bloku HalfwidthAndFullwidthForms. – ikegami

4

Można użyć charnames::viacode uzyskać imiona postaci z ich kodami:

#!/usr/bin/perl 
use warnings; 
use strict; 
use utf8; 

use charnames qw(); 


my $string = q(Subject: Al l the ad ult mov ies you' ve see n a r e nothing) 
      .q(c ompari- ng t o our exx xci t i ng compilation of 13' 000) 
      .q(mov ies in HD t hat are a v ailable for y ou now!); 

my $count = grep /FULLWIDTH/, map charnames::viacode(ord), split //, $string; 
print "$count fullwidth characters.\n";