JoJ*_*oJo 2 php regex perl spam-prevention
我想使用Perl正则表达式来匹配这样的字符串:
spaM
s p a m
sp Am
S p a m
Run Code Online (Sandbox Code Playgroud)
看看Perl的x修饰符,我应该能够这样做:
<?php
echo preg_match('#spam#ix', 's p a m');
?>
Run Code Online (Sandbox Code Playgroud)
但这打印出0(假).该x修改实际上忽略了对正则表达式的空白,不被分析的字符串.我怎么会这样做呢?也就是说,忽略正在分析的字符串上的空格而不是我的正则表达式?我知道有多步骤方法可以做到这一点,例如首先从字符串中剥离所有空白区域,但我想知道是否有强大的一步法正则表达式解决方案.
说实话,我认为你最好剥离空白然后匹配.由于这是你的意思,你的代码将比找到魔法正则表达式或在字母之间注入whitspace图案更清晰.
Perl对于这将看起来像.
my $string = "S p A m";
(my $string_no_ws = $string) =~ s/\s//g;
if ($string_no_ws =~ /spam/i) {
#do something
}
Run Code Online (Sandbox Code Playgroud)
实际上,如果你愿意,你可以在没有正则表达式的情况下进行测试,使用index:
my $string = "S p A m";
(my $lc_string_no_ws = lc $string) =~ s/\s//g;
if (index($lc_string_no_ws, 'spam') >= 0) {
#do something
}
Run Code Online (Sandbox Code Playgroud)
该#x修改工作周围的其他方法.它允许在正则表达式中使用无关的空格,在搜索时会忽略该空格:
preg_match('# s p a m #ix')
Run Code Online (Sandbox Code Playgroud)
只会匹配"垃圾邮件".
为了在正则表达式中找到任意空格,你需要做的是\s*在任何字母之间注入:
preg_match('# S \s* P \s* A \s* M #ix', 's p a m');
Run Code Online (Sandbox Code Playgroud)
通过\s*使用以下混合将单词转换为适当的正则表达式,您可以自动化/简化这一点:
$regex = join('\s*', str_split("spam", 1));
preg_match("#$regex#ix", "s p a m");
Run Code Online (Sandbox Code Playgroud)