2013-05-09 2 views
6

Я использую listadmin для управления многочисленными почтовыми списками на основе mailman. У меня длинный список тем и адресов, настроенных для блокировки спама. В последнее время я получил умнее спам в том смысле, что он использует симпатичные символы Unicode, например:Perl: Как совместить FULLWIDTH LATIN SMALL

Subject: Al л объявление щий мы х лет вы»ве не видит NARE ничего гр ompari- нг наших ехй xci ti ng компиляция 13 000 модов в HD t шляпа av avable для y ou сейчас!

или

Тема: HD ква горит у VI d Eos зве фо графу с о е хо TC HIC кс
здесь для и

Теперь я хочу используйте интеллектуальное регулярное выражение Perl, чтобы заблокировать это. Трубопроводы этих предметов в hexdump показали, что многие символы - это FULLWIDTH LATIN SMALL LETTER. Однако \p{FULLWIDTH LATIN SMALL LETTER} не работает: Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

Вопрос: Есть ли \p{something} в соответствии с этими символами полной ширины? Альтернативно: есть ли другой способ сопоставить эти символы?

ответ

8

Доступные документы доступны для классов символов Юникода. Я нашел его в качестве ссылки в perlrebackslash, который документирует специальные классы символов и обратные слешковые последовательности, такие как \p{...} в регулярных выражениях.

Резюме состоит в том, что для всех, кроме наиболее распространенных классов свойств, требуется тип свойства и значение свойства, которые разделены : или =. Однако, похоже, не упоминается о символах полной ширины в качестве предопределенного свойства.

Но есть свойство Block/Blk, которые могут иметь Halfwidth and Fullwidth Forms (U+FF00 - U+FFEF) в качестве значения:

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

Это будет соответствовать на вашем входе (проверено на v16.3).


Полезным инструментом для этого является 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 

Как вы можете видеть, \p{Block=Halfwidth and Fullwidth Forms} можно также записать \p{In Halfwidth and Fullwidth Forms}.

+0

большое спасибо @ikegami для просветительского редактирования и развлекательного модуля он связан с. – amon

+0

Это один из tchrist's. 'unichars' может использоваться для обращения. например 'unichars -au '\ p {InHalfwidthAndFullwidthForms}' 'перечисляет символы в блоке HalfwidthAndFullwidthForms. – ikegami

4

Вы можете использовать charnames::viacode, чтобы получить имена персонажей из их кодов:

#!/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"; 
Смежные вопросы