7

我正在使用listadmin来管理许多基于 mailman 的邮件列表。我有一长串主题和地址设置来阻止垃圾邮件。最近,我收到了更智能的垃圾邮件,因为它使用了漂亮的 Unicode 字符,例如:

主题:您所看过的所有成人电影都无法与我们的 13' 000 部高清电影的 exxx 精彩合辑相比,现在您可以观看!

或者

主题:HD qua lit y vi d eos 和 d pho to graph s of ho tc hic ks<br> are here for you

现在我想使用智能 Perl 正则表达式来阻止它。将这些主题传递给 hexdump 显示许多字符是全宽拉丁小写字母。但是,\p{FULLWIDTH LATIN SMALL LETTER}不起作用:Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

所以问题是:是否有一个\p{something}匹配那些全角字符?或者:还有其他方法可以匹配这些字符吗?

4

2 回答 2

9

该页面perlunicode记录了可用的 unicode 字符类。我在 perlrebackslash 中找到了它作为参考,它记录了特殊字符类和反斜杠序列,如正则\p{...}表达式。

总结是除了最常见的属性类之外,所有属性类都需要属性类型和属性值,它们之间用:or分隔=。但是,似乎没有提到全角字符作为预定义属性。

但是有Block/Blk属性,它可以具有Halfwidth and Fullwidth Forms( U+FF00-<code>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}

于 2013-05-09T20:34:02.803 回答
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";
于 2013-05-09T20:34:12.880 回答