Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于匹配字符串上可疑单词的正则表达式_Php_Regex - Fatal编程技术网

Php 用于匹配字符串上可疑单词的正则表达式

Php 用于匹配字符串上可疑单词的正则表达式,php,regex,Php,Regex,我正在用PHP开发一个“单词过滤器”类,它需要捕获故意拼错的单词。这些单词由用户作为句子输入。让我展示一个用户输入的句子的简单示例: 我想要可乐、性、毒品和摇滚乐 上面的例子是一个常见的短语写正确。我的班级会找到可疑的单词sex和drugs,一切都会好起来的 但我认为用户会试图阻止对单词的检测,并写一些不同的东西。事实上,他有许多不同的方法来书写同一个单词,因此对于某些类型的人来说,它仍然是可读的。例如,sex一词可以写成s3x或5ex或53x或sex或s3x或s33xxx等 我了解正则表达式的

我正在用PHP开发一个“单词过滤器”类,它需要捕获故意拼错的单词。这些单词由用户作为句子输入。让我展示一个用户输入的句子的简单示例:

我想要可乐、性、毒品和摇滚乐

上面的例子是一个常见的短语写正确。我的班级会找到可疑的单词
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
我需要的是8根火柴

  • 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”的字符
----------------------------------------------------------------------
|或
----------------------------------------------------------------------
我很高兴
-----------------------------------------------------