PHP-如何识别字符串中存在5个以上连续重复字符或汉字?
我在做个垃圾内容识别功能,其中有一种初步审核情况是检查内容字符串中,是否存在多个连续重复字符或汉字,用php怎么能够简单做到
如,'顶顶顶顶aaaaaaaaaaa。。。。。。。。'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我在做个垃圾内容识别功能,其中有一种初步审核情况是检查内容字符串中,是否存在多个连续重复字符或汉字,用php怎么能够简单做到
如,'顶顶顶顶aaaaaaaaaaa。。。。。。。。'
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
你可以这样把字符串按字符求ascall码,若连续5个字符的ascall码相加除以5等于这5个连续字符的第一个字符的ascall码,则说明这是连续重复字符。若字符串编码为gb2312,若连续10个字符的ascall码相加除以5等于这10个连续字符的前两个字符的ascall码的和,则说明这是连续重复汉字。若字符串编码为utf8,若连续15个字符的ascall码相加除以5等于这15个连续字符的前三个字符的ascall码的和,则说明这是连续重复汉字。以此类推,算出一共多少个连续重复字符或汉字。
刚写了一个,可能有些情况也判断不到,请大家多测试并提出~
/**
* 查找连续出现指定次数的字符(中文为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));
这是我刚才写了一个,你试一试:
<?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)
}
}
//测试已经通过,没问题的
?>