PHP-如何识别字符串中存在5个以上连续重复字符或汉字?

PHP-如何识别字符串中存在5个以上连续重复字符或汉字?

浮生未歇 发布于 2016-10-13 字数 175 浏览 1456 回复 3

我在做个垃圾内容识别功能,其中有一种初步审核情况是检查内容字符串中,是否存在多个连续重复字符或汉字,用php怎么能够简单做到
如,'顶顶顶顶aaaaaaaaaaa。。。。。。。。'

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-10-26 3 楼

你可以这样把字符串按字符求ascall码,若连续5个字符的ascall码相加除以5等于这5个连续字符的第一个字符的ascall码,则说明这是连续重复字符。若字符串编码为gb2312,若连续10个字符的ascall码相加除以5等于这10个连续字符的前两个字符的ascall码的和,则说明这是连续重复汉字。若字符串编码为utf8,若连续15个字符的ascall码相加除以5等于这15个连续字符的前三个字符的ascall码的和,则说明这是连续重复汉字。以此类推,算出一共多少个连续重复字符或汉字。

瑾兮 2017-10-07 2 楼

刚写了一个,可能有些情况也判断不到,请大家多测试并提出~

/**
* 查找连续出现指定次数的字符(中文为utf-8)
*
* @param string $str 要查找的字符串
* @param int $count 连续出现的次数
* @param bool $tolower 是否区分大小写,默认 true
* @reutrn array
*/
function find_repeat_chars($str,$count,$tolower = true) {

$repeat_chars = array();
$str = $haystack = $tolower ? strtolower($str) : $str;
preg_match_all("/[xe0-xef][x80-xbf]{2}/",$str,$tmp);
$tt = array();
if(isset($tmp[0]) && !empty($tmp[0])) {
$tt = array_unique($tmp[0]);
$haystack = str_replace($tt,'',$haystack);
}
$chars = array_merge(str_split(count_chars($haystack,3)),$tt);
foreach($chars as $c) {
if(!preg_match('/('.$c.'){'.$count.',}/',$str)) continue;
$repeat_chars[] = $c;
}
return $repeat_chars;
}

$str = '啊啊啊啊啊啊我!abcBb来bbbbB';
var_dump(find_repeat_chars($str,5));

灵芸 2016-10-26 1 楼

这是我刚才写了一个,你试一试:

<?php
//先用这个方法把你的字符串分割
function chSplit($str){
$ascLen=strlen($str);
for($i;$i<$ascLen;$i++){
$c=ord(substr($str,0,1));
if(ord(substr($str,0,1)) >252){$p = 5;}elseif($c > 248){$p = 4;}elseif($c > 240){$p = 3;}elseif($c > 224){$p = 2;}elseif($c > 192){$p = 1;}else{$p = 0;}
$truekey=substr($str,0,$p+1);
if($truekey===false){break;}
$splikey[]=$truekey;
$str=substr($str,$p+1);
}
return $splikey;
}
$str="顶顶顶顶顶aaaaaaaaa";
$arr = chSplit($str);

//然后遍历这个数组的每个元素,让每个元素匹配
for($i=0;$i<count($arr);$i++) {
if(substr_count($str,str_repeat($arr[$i],5))) {
echo "存在连续5个字符";
break;
}else{
//echo "不存在连续字符";
//break;
//把这里注释掉就可以循环判断了,回复@可乐(15426248)

}
}

//测试已经通过,没问题的

?>