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";
Другие вопросы по тегам