我知道regex中的/s
修饰符,但不适用于我的具体情况。
例如,我正在尝试创建一个垃圾邮件过滤器,以将网址与此类域名相匹配
https://www.theonlineleaflets.com/u=/544hfb34s21jv335hs/u
正则表达式:
https:\/\/www\..+?\/u\/\w{18}\/u
问题在于,垃圾邮件发送者会随机插入换行符和=
符号,例如:
<area coords=3D"0,0,1000,1000" href=3D"https://www.theonlineleaflets.com/u=
/544hfb34s21jv335hs/u"/>
OR:
<area coords=3D"0,0,1000,1000" href=3D"https://www.netprofessionalbitcoin.=
com/u/565i71cag5hd3kdh3mds/u"/>
OR:
<area coords=3D"0,0,1000,1000" href=3D"https://www.theonlineleaflets.com/=
u/544hfb34s21jv335hs/u"/>
我非常确定不能忽略新行,但是我要问的是我错了,或者有人知道更好的正则表达式标记这些垃圾邮件发送者就足够了。
注意:这是针对cPanel的,因此我认为它是标准的PERL格式,而且我认为它仍然不支持/s
之类的修饰符。
更新:似乎新行始终位于=
符号之后,但是该符号可以位于url中的任何位置。
答案 0 :(得分:2)
我想出了这个正则表达式,它考虑了潜在的换行符。
https:\/\/www\..+?\/=?(?:\s*?)?u(?:\s*?)?=?(?:\s*?)?\/.*?u
基本上,我使用(?:\s*?)?
,它是任意数量的空白字符(包括换行符)的可选,非捕获,惰性匹配。如果要将其限制为仅换行符,请改用\n
。 Here's演示。
答案 1 :(得分:1)
我已将您的正则表达式更改为支持'=
'和White Space
(包括Newlines
)。
这是正则表达式:
https:\/\/www\..+?\/[u=\s]+\/[\w=\s]+\/[u=\s]+
我更改的是使用字符类而不是文字匹配。这样,'='和换行符将被有效忽略,它将与您的所有示例匹配。
唯一的“问题”是我删除了“ {18}
”量词(因为那些不好的字符占据了空间)。
编辑:
https:\/\/www\.[\s\S]+?\/[u=\s]+\/[\w=\s]+\/[u=\s]+
我将点'.
'更改为字符类'[\s\S]
'。现在网址中也可以有Newlines
。
关于18个限定词:在第二个示例中有20个字符,因此如果您限制该字符串,它将不匹配。