Php 用于匹配字符串上可疑单词的正则表达式
我正在用PHP开发一个“单词过滤器”类,它需要捕获故意拼错的单词。这些单词由用户作为句子输入。让我展示一个用户输入的句子的简单示例:Php 用于匹配字符串上可疑单词的正则表达式,php,regex,Php,Regex,我正在用PHP开发一个“单词过滤器”类,它需要捕获故意拼错的单词。这些单词由用户作为句子输入。让我展示一个用户输入的句子的简单示例: 我想要可乐、性、毒品和摇滚乐 上面的例子是一个常见的短语写正确。我的班级会找到可疑的单词sex和drugs,一切都会好起来的 但我认为用户会试图阻止对单词的检测,并写一些不同的东西。事实上,他有许多不同的方法来书写同一个单词,因此对于某些类型的人来说,它仍然是可读的。例如,sex一词可以写成s3x或5ex或53x或sex或s3x或s33xxx等 我了解正则表达式的
我想要可乐、性、毒品和摇滚乐
上面的例子是一个常见的短语写正确。我的班级会找到可疑的单词sex
和drugs
,一切都会好起来的
但我认为用户会试图阻止对单词的检测,并写一些不同的东西。事实上,他有许多不同的方法来书写同一个单词,因此对于某些类型的人来说,它仍然是可读的。例如,sex
一词可以写成s3x
或5ex
或53x
或sex
或s3x
或s33xxx
等
我了解正则表达式的基本知识,并尝试了以下模式:
/(\b[\w][\w.-]+[\w]\b)/g
因为
单词边界\b
这个词可以以一个字母或一个数字开头[\w]
。。。后跟任何字母、数字、空格、点、引号或破折号[\w.-]
。。。一次或多次+
。。。以一个字母或一个数字结尾[\w]
单词边界\b
我想要一杯可乐,5 3 x,DruuuU95和r0ck'n'r011
我得到3个匹配项:
我想要一杯可乐
5 3 x
druuuuuu95和r0ck'n'r011
I
want
a
coke
5 3 x
druuu95
和
r0ck'n'r011
I
和a
),不包含数字。这种表达并非完美无瑕,但确实有助于说明为什么进行这种语言匹配非常困难,因为这是一场创造性的人试图在不被发现的情况下表达自己与开发团队之间的军备竞赛
(?:\s+\A)[#'”[(?)(?)((?:[A-z]{2}\s+{3})(?:[A-zA-z'-]{2,}[ia]| i[nst]|o[fnr][?!,;:“}\]](?=(?:\s}\z)){124;(?:[A-z]{2,}\ia]{i[nst o[fnr][?!,;;:“}}}}}\b}>
**要更好地查看图像,只需右键单击图像并选择“在新窗口中查看”
此正则表达式将执行以下操作:
- 找到所有可以接受的词
- 找到所有剩余的并将其存储在捕获组1中
例子
现场演示
解释
节点说明
----------------------------------------------------------------------
(?:组,但不捕获:
----------------------------------------------------------------------
\s+空格(\n、\r、\t、\f和“”)(1
或更多次(与最大金额匹配)
(可能的)
----------------------------------------------------------------------
|或
----------------------------------------------------------------------
\A是字符串的开头
----------------------------------------------------------------------
)分组结束
----------------------------------------------------------------------
[#'”[({]?以下任意字符:“#',”,“,”,“[',”(',
“{”(可选)(匹配最大金额)
(可能的)
----------------------------------------------------------------------
(?!向前看,看看是否有:
----------------------------------------------------------------------
(?:组,但不捕获(3次):
----------------------------------------------------------------------
[a-z]{2}‘a’到‘z’(2次)的任何字符
----------------------------------------------------------------------
\s+空格(\n、\r、\t、\f和“”)
(1次或更多次(与most匹配)
(可能的金额)
----------------------------------------------------------------------
){3} 分组结束
----------------------------------------------------------------------
)展望的结束
----------------------------------------------------------------------
(?:组,但不捕获:
----------------------------------------------------------------------
[a-zA-Z'-]{2,}‘a’到‘Z’、‘a’到‘Z’的任何字符
‘Z’、‘’、‘-’(至少2次
(匹配尽可能多的金额)
----------------------------------------------------------------------
|或
----------------------------------------------------------------------
[ia]任何“i”、“a”的字符
----------------------------------------------------------------------
|或
----------------------------------------------------------------------
我很高兴
-----------------------------------------------------