2011-06-11 88 views
1

您好所有PHP - 字词过滤器

我想使用的preg_match,以确定是否一个字的文本字符串中找到。如果单词中每个字符有多个实例(按正确的顺序),则需要拾取该单词。为了让自己的生活变得艰难,即使客户试图通过在我希望匹配的单词中输入某些字符来'愚弄'preg_match,我也想要接受这个单词。

它用于swearword过滤器,如果'dave'被发现,我会用其他东西替换它。我试图想出完美的正则表达式,但我没有太多的运气。请看下面的例子以及我迄今发现的问题(我用3作为客户端可以用来'欺骗'支票的一个例子字符);


使用:~\b(?:3+)?d+(?:3+)?a+(?:3+)?v+(?:3+)?e+(?:3+)?\b~i

  • 输入:戴夫=传递
  • 输入:3d3a3v3e3 =传递
  • 输入:ddddaaaavvvveeee =传递
  • 输入:3ave =失败

不行

  • 输入:dd3ddaa3aa3vv3vvee3ee =失败(我想这个通过)

使用:~\b[d3]+[a3]+[v3]+[e3]+\b~i

  • 输入:戴夫=传递
  • 输入:3d3a3v3e3 =传递
  • 输入:ddddaaaavvvveeee =传递
  • 输入:dd3ddaa3aa3vv3vvee3ee =传递

不行

  • 输入:3ave =通(我想这个失败)

感谢您对正则表达式的帮助,它的大加赞赏。

+1

如果密码是“matthew”,该怎么办? mmmmaaaatttthhhheeeewwww – 2011-06-11 21:54:03

回答

2

不讨论它是否是一个好的亵渎筛选器(可能不是!),下面的正则表达式将满足您的规格:

d.*a.*v.*e 

如果“3”是唯一的“特”字,那就试试这个:

d3*a3*v3*e 
+0

为什么不是'。* d。* a。* v。* e。*'然后呢?我假设'3dave'是无效的。 – Halcyon 2011-06-11 22:23:09

+0

'。*'在正则表达式的开头或结尾处是无操作的。 RE允许匹配字符串的一部分,不一定是整个字符串 – unbeli 2011-06-11 22:25:19

+0

这有帮助,我会尝试:'〜(?:\ w +)?d。*?a。*?v。*?e (?:\ w +)〜i' – Matthew 2011-06-11 23:28:11

2

这不会工作。

例如,您的过滤器会阻止“救火车”)

有人也可能只是替代了v<

一个uc我不知道是否有一个建立亵渎过滤器的好方法,除了有一大堆已知单词和拼写错误的白名单。

也许你应该重新思考为什么你想要亵渎过滤器。如果你的'顾客'想要它,让他们提供他们想阻止的单词列表,这不是你的问题。