【问题标题】:PHP / Regex: Check if string was copy pastedPHP / 正则表达式:检查字符串是否被复制粘贴
【发布时间】:2012-11-06 15:27:50
【问题描述】:

我正在尝试为要检查字符串是否为复制+粘贴工作的字符串编写验证函数。

背景:

我们有一个 CMS,用户可以在其中输入最少 - 例如 - 200 个字符的描述文本。很多用户写的文字太短,并得到“你必须使用超过 200 个字母”的错误信息。 为了避免这种情况,他们复制粘贴文本或一些虚拟字符串(如“AAAAA”)以达到限制。

我现在正在寻找一个函数/方法/正则表达式来检测此类复制+粘贴字符串并通过显示消息来阻止它们。

我知道没有 100% 的解决方案来防止虚拟文本,但我们想稍微减少它。有什么想法吗?

【问题讨论】:

  • 你可能不得不以某种方式通过 JavaScript 来做到这一点。
  • 你最好允许短文本。
  • 就我个人而言,我并不担心。如果人们想玩弄这个系统,总有办法的。他们可以简单地开始输入“123456...”。如果重复是一种风格选择呢?无论哪种方式,您正在寻找的是最长的公共子字符串。我建议您将您的问题更改为此效果或基于它的谷歌。顺便说一句,这不是一个小问题,可能不值得为您引用的用例投入太多时间。
  • 您将需要一个复杂的启发式算法才能接近解决这个问题。顺便说一句,您可以检查同一字符是否连续出现一定次数(例如/(.)\1{N,}/),但这实际上只会让您到目前为止。我建议信任您的用户,否则您将在这个项目上投入大量时间。
  • 要正确执行此操作,您需要对人类语言进行语言处理以获得意义,最好由人类完成。任何更少的东西都会产生更多的误报、愤怒的用户和支持麻烦,而不是阻止糟糕的描述。强迫用户做他们不想做的事情通常是行不通的,你会得到你所拥有的行为。考虑要么让它滑动。或者取消最低描述要求。或者将大描述分解成一堆更短、更容易回答的问题。

标签: php regex string validation


【解决方案1】:

不会有快速、可靠、无懈可击的解决方案。但我可以想到一个折衷方案:

preg_match('/(.{1,4})\1{3,}/', $subject)

对于包含 1 到 4 个字符的重复序列的字符串(当它们至少重复 3 次时),将返回 True

所以它会匹配像

这样的字符串
AAAAAAA
asdasdasdasd
foo bar baz glglglglglglglgl

它不会检测到更长的重复,例如

asdfgasdfgasdfgasdfg

但是如果你尝试匹配更长的重复,正则表达式的复杂性将会成倍增长,所以我认为四个字符是一个可行的折衷方案。

或者,您可能希望将重复锚定到字符串的末尾(大多数人会在其中放置填充符):

preg_match('/(.+)\1{3,}$/', $subject)

当然,然后是一个类似的字符串

LOL OMG!!!!!!!!!!!!!!!!!!!!!!!!!!!.

不会被检测到。你的选择:)

【讨论】:

  • 谢谢!这是为我的特定问题找到解决方案的一个很好的提示。
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多