2

我正在编写我的反垃圾邮件/恶意过滤器,如果可能的话,我需要,

仅匹配(检测)由混合字符组成的单词,例如:fr1&nd$ 而不是朋友

这可能与正则表达式!?

最好的祝福!

4

4 回答 4

6

当然可以使用正则表达式!你不是要求匹配嵌套的括号!:P

但是,是的,这就是正则表达式的用途。一个例子:

/\S*[^\w\s]+\S*/

这将匹配以下所有内容:

@ss
as$
a$s
@$s
a$$
@s$
@$$

不会匹配这个:

ass

我相信这是你想要的。这个怎么运作:

\S*匹配 0 个或多个非空格字符。[^\w\s]+仅匹配符号(它将匹配任何不是单词或空格的字符),并匹配其中的 1 个或多个(因此需要符号字符。)然后\S*再匹配 0 个或多个非空格字符(符号和字母)。

如果允许我提出更好的策略,在 Perl 中,您可以将正则表达式存储在变量中。我不知道您是否可以在 PHP 中执行此操作,但如果可以,您可以构建一个变量列表,如下所示:

$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...

或者:

$regex = array( 'a' => /[aA@]/, 'b' => /[bB]/, 'c' => /[cC(]/, ... );

这样,您可以将所有排列中的“朋友”与:

/$f$r$i$e$n$d/

或者:

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/

诚然,第二个看起来不必要地冗长,但那是你的 PHP。我认为第二个可能是最好的解决方案,因为它将它们全部存储在哈希中,而不是全部作为单独的变量,但我承认它产生的正则表达式有点难看。

于 2009-05-10T19:29:32.637 回答
0

您可以构建一些正则表达式,如下所示:

\p{L}+[\d\p{S}]+\S*

这将匹配一个或多个字母(\p{L}+参见Unicode 字符首选项)、一个或多个数字或符号 ( [\d\p{S}]+) 以及任何后续非空白字符的任何序列\S*

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
于 2009-05-10T19:19:45.493 回答
0

有可能,您不会有非常漂亮的正则表达式规则,但您基本上可以匹配您可以使用正则表达式描述的任何模式。棘手的部分是描述它。

我猜你会有一堆正则表达式规则来检测像这样的坏词:

要检测 fr1&nd$、friends、fr**nd*,您可以使用如下正则表达式:

/fr[1iI*][&eE]nd[s$Sz]/

对每个规则执行类似的操作会在括号中找到所有可能字符的变体。获取正则表达式指南以获取更多信息。

(我假设你想要一个坏词过滤器,你可能想要掩盖坏词以及所有可能的排列friendfrie**

于 2009-05-10T19:20:11.950 回答
0

没有彻底测试,但应该这样做:

(\w+)*(?<=[^A-Za-z ])
于 2009-05-10T19:35:46.980 回答