Php 正则表达式-使用混合字符匹配(仅)单词

Php 正则表达式-使用混合字符匹配(仅)单词,php,regex,filter,match,profanity,Php,Regex,Filter,Match,Profanity,我正在编写我的反垃圾邮件/恶意软件过滤器,如果可能,我需要 只匹配(检测)由混合字符组成的单词,如:fr1&nd$,而不是朋友 这在正则表达式中可能吗 致以最良好的祝愿 您可以构建一些正则表达式,如下所示: \p{L}+[\d\p{S}]+\S* @ss as$ a$s @$s a$$ @s$ @$$ 这将匹配一个或多个字母(\p{L}+,请参阅)、一个或多个数字或符号([\d\p{S}]+)和任何后续非空白字符的任何序列 $str = 'fr1&nd$ and not friend

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

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

这在正则表达式中可能吗


致以最良好的祝愿

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

\p{L}+[\d\p{S}]+\S*
@ss
as$
a$s
@$s
a$$
@s$
@$$
这将匹配一个或多个字母(
\p{L}+
,请参阅)、一个或多个数字或符号(
[\d\p{S}]+
)和任何后续非空白字符的任何序列

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);

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

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

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

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

对每个规则执行类似操作将在括号中找到所有可能字符的变体。获取更多信息,请参阅regex指南


(我假设对于坏词过滤器,您需要
friend
以及
frie**
,您可能需要屏蔽坏词以及所有可能的排列)

当然,使用regex也是可能的!您没有要求匹配嵌套括号!:P

但是,是的,正则表达式就是为这种事情而构建的。例如:

/\S*[^\w\s]+\S*/
这将符合以下所有条件:

\p{L}+[\d\p{S}]+\S*
@ss
as$
a$s
@$s
a$$
@s$
@$$
它与此不匹配:

ass
我相信这就是你想要的。工作原理:

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

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

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

因此,您可以将所有排列中的“friend”与以下内容匹配:

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


当然,第二个看起来不必要的冗长,但这是PHP适合您的。我认为第二个可能是最好的解决方案,因为它将它们全部存储在一个散列中,而不是全部作为单独的变量,但我承认它生成的正则表达式有点难看。

没有彻底测试这一点,但这应该可以做到:

(\w+)*(?<=[^A-Za-z ])

(\w+)*(?我厌倦了,在Perl中做过一次。正则表达式看起来非常可怕,特别是当你试图解释拼写错误时。这与“a”(单词后跟空格)匹配。我的坏:)我已经更改了它,额外的空间应该可以做到。很棒的正则表达式+解释+1!顺便说一句,PHP中的正则表达式存储在字符串中,所以可以像您建议的那样进行变量排列。实际上,将其写入函数可能会很有趣。传入一个正常的单词,它将使用正确的正则表达式进行应答以检测该单词。我能看到的唯一问题是像W=\/\/或任何多字符的东西。W=!(?:[wW]\\/\\\/)!(在我的母语Perl中)。对于像W这样的多字符匹配来说,这将更加困难,但肯定是可能的。可以很容易地编写一个函数,它逐个字符地遍历一个字符串,然后查找与该字符匹配的正则表达式,然后将所有正则表达式组合成一个巨大的(看起来很可怕的)正则表达式,您可以使用它来匹配该单词。然而,我并没有经常使用PHP来做这件事。如果我突发奇想,我可能会用Perl来做。或者不管这个表达是什么。