Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.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/Regex:检查字符串是否被复制粘贴_Php_Regex_String_Validation - Fatal编程技术网

PHP/Regex:检查字符串是否被复制粘贴

PHP/Regex:检查字符串是否被复制粘贴,php,regex,string,validation,Php,Regex,String,Validation,我正在尝试为字符串编写一个验证函数,其中我要检查字符串是否为复制+粘贴工作 背景: 我们有一个CMS,用户可以输入至少200个字符的描述文本。许多用户写的文本太短,会收到“您必须使用超过200个字母”的错误消息。 为了避免这种情况,他们复制粘贴文本或一些伪字符串(如“AAAAA”)以达到限制 我现在正在寻找一个函数/methode/regex来检测这种复制+粘贴字符串,并通过显示消息来防止它们 我知道没有100%的解决方案来防止虚假文本,但我们想减少一点。有什么想法吗?不会有一个快速、可靠、不可

我正在尝试为字符串编写一个验证函数,其中我要检查字符串是否为复制+粘贴工作

背景:

我们有一个CMS,用户可以输入至少200个字符的描述文本。许多用户写的文本太短,会收到“您必须使用超过200个字母”的错误消息。 为了避免这种情况,他们复制粘贴文本或一些伪字符串(如“AAAAA”)以达到限制

我现在正在寻找一个函数/methode/regex来检测这种复制+粘贴字符串,并通过显示消息来防止它们


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

不会有一个快速、可靠、不可战胜的解决方案。但我可以想出一个折衷办法:

preg_match('/(.{1,4})\1{3,}/', $subject)
对于包含一到四个字符的重复序列(至少重复三次)的字符串,将返回
True

所以它会在字符串上匹配,比如

AAAAAAA
asdasdasdasd
foo bar baz glglglglglglglgl
它不会检测到像这样更长的重复

asdfgasdfgasdfgasdfg
但是,如果您尝试匹配更长的重复,正则表达式的复杂性将呈指数级增长,因此我认为四个字符是一个可行的折衷方案

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

但当然,然后是一根像

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

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

不会有一个快速、可靠、不可抵抗的解决方案。但我可以想出一个折衷办法:

preg_match('/(.{1,4})\1{3,}/', $subject)
对于包含一到四个字符的重复序列(至少重复三次)的字符串,将返回
True

所以它会在字符串上匹配,比如

AAAAAAA
asdasdasdasd
foo bar baz glglglglglglglgl
它不会检测到像这样更长的重复

asdfgasdfgasdfgasdfg
但是,如果您尝试匹配更长的重复,正则表达式的复杂性将呈指数级增长,因此我认为四个字符是一个可行的折衷方案

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

但当然,然后是一根像

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

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

您可能需要通过JavaScript来完成。您最好允许使用较短的文本。就个人而言,我不担心这一点。如果人们想玩这个系统,总有办法的。他们可以简单地开始输入“123456…”。如果重复是一种文体选择呢?不管怎样,您要查找的是最长的公共子字符串。我建议你把你的问题改成这个效果,或者在谷歌的基础上。顺便说一句,这不是一个微不足道的问题,可能不值得为你引用的用例投入太多时间。你需要一个复杂的启发式算法来解决这个问题。现在,您可以检查同一个字符是否在一行中出现一定次数(类似于
/()\1{N,}/
),但这实际上只能让您了解到这一点。我建议信任你的用户,否则你会在这个项目上投入大量时间。要正确地做到这一点,你需要对人类语言进行语言处理,以获得意义,最好由人类完成。任何不这样做都会产生更多的误报、愤怒的用户和支持问题,而不会阻止糟糕的描述。强迫用户做他们不想做的事情通常是行不通的,你会得到你的行为。考虑要么让它滑动。或取消最低描述要求。或者把大量的描述分解成一堆更短、更容易回答的问题。你可能需要通过JavaScript来完成。你最好允许更短的文本。就个人而言,我不担心这一点。如果人们想玩这个系统,总有办法的。他们可以简单地开始输入“123456…”。如果重复是一种文体选择呢?不管怎样,您要查找的是最长的公共子字符串。我建议你把你的问题改成这个效果,或者在谷歌的基础上。顺便说一句,这不是一个微不足道的问题,可能不值得为你引用的用例投入太多时间。你需要一个复杂的启发式算法来解决这个问题。现在,您可以检查同一个字符是否在一行中出现一定次数(类似于
/()\1{N,}/
),但这实际上只能让您了解到这一点。我建议信任你的用户,否则你会在这个项目上投入大量时间。要正确地做到这一点,你需要对人类语言进行语言处理,以获得意义,最好由人类完成。任何不这样做都会产生更多的误报、愤怒的用户和支持问题,而不会阻止糟糕的描述。强迫用户做他们不想做的事情通常是行不通的,你会得到你的行为。考虑要么让它滑动。或取消最低描述要求。或者把大量的描述分解成一堆更简短、更容易回答的问题。谢谢!这是一个很好的提示,可以为我的具体问题找到解决方案。谢谢!这是一个很好的提示,可以为我的具体问题找到解决方案。