正则表达式 - 匹配(仅)具有混合字符的单词
题
我正在编写我的反垃圾邮件/恶意过滤器,如果可能的话我需要,
仅匹配(检测)由混合字符组成的单词,例如:fr1&nd$ 而不是朋友
这可以用正则表达式实现吗?
此致!
解决方案
当然有可能用正则表达式!你不是要求来匹配嵌套的括号! :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。我认为第二个可能是最好的解决方案,因为它存储他们所有的哈希,而不是全部作为独立的变量,但我承认,它产生的正则表达式是有点丑。
其他提示
这是可能的,你不会有很漂亮的正则表达式规则,但可以基本匹配,你可以使用正则表达式描述的任何图案。棘手的部分是描述它。
我猜你有一堆的正则表达式规则来检测,像这样不好的话:
要检测FR1和第二$,朋友,FR ** ND *您可以像使用正则表达式:
/fr[1iI*][&eE]nd[s$Sz]/
做这样的事情每个规则会发现在括号可能的字符的所有变化。拿起一个正则表达式引导以获得更多信息。
(我假设你想friend
以及frie**
一个BADWORDS过滤器,你可能想掩盖坏词,以及所有可能的排列)
没有彻底测试这一点,但是这应该这样做:
(\w+)*(?<=[^A-Za-z ])
您可以构建一些正则表达式,如下所示:
\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);