Perl: Как соответствовать FULLWIDTH LATIN SMALL
Я использую listadmin для управления многими списками рассылки на основе почтальона. У меня длинный список тем и адресов, настроенных для блокировки спама. Недавно я получил более умный спам в том смысле, что в нем используются красивые символы Юникода, например:
Тема: Все, что вы видите, вы не видите ничего, что могло бы сравниться с нашей подборкой из 1 - mov00 фильмов в HD-формате, которые теперь доступны для вас!
или же
Тема: HD - это изображение и видео с графиком
здесь для u
Теперь я хочу использовать умное регулярное выражение Perl, чтобы заблокировать это. Прикрепление этих предметов к hexdump показало, что многие символы являются ПОЛНЫМ ЛАТИНСКИМ МАЛЫМ ПИСЬМОМ. Тем не мение, \p{FULLWIDTH LATIN SMALL LETTER}
не работает: Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"
Таким образом, вопрос: есть ли \p{something}
сопоставить эти символы полной ширины? В качестве альтернативы: есть ли другой способ сопоставления этих символов?
2 ответа
Страница perlunicode
Документы доступны Unicode символов классов. Я нашел его в качестве ссылки в 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}
,
Ты можешь использовать 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";