计算两个字符串的不同

<?php
header('Content-type:text/html;charset=utf-8;');
$str1='哈哈哈213213sdfsdf';
$str2='test哈哈';
echo $str1;
echo "<br/>";
echo $str2;
echo "<br/>";
//echo mb_substr($str1, 5, utf8_strlen($str1)-5, 'utf-8');die();
// 计算中文字符串长度,这个函数是在网上搜的,忘记网址了......
function utf8_strlen($string = null) {
	// 将字符串分解为单元
	preg_match_all('/./us', $string, $match);
	// 返回单元个数
	return count($match[0]);
}
//检测字符串相同的部分
function check_str($str1,$str2){
	$strlen=utf8_strlen($str1);
	$str_temp='';
	for ($i=0; $i <$strlen ; $i++) { 
		for ($j=1; $j <=$strlen-$i ; $j++) {
			$str_1=mb_substr($str1, $i, $j, 'utf-8');
			$str_start=strpos($str2, $str_1);
			if (!($str_start===false)) {
				if(strlen($str_1)>strlen($str_temp)){
					$str_temp=$str_1;
					$ex_info=array(
						'str1_left'=>$i,
						'str1_right'=>$j,
						'str2_left'=>$str_start,
						'str2_right'=>$str_start+strlen($str_temp),
					);
				}	
			}
			
		}
	}
	$res_arr=array();
	if (isset($ex_info)) {
		$str1_left_str=mb_substr($str1, 0, $ex_info['str1_left'], 'utf-8');
		$str2_left_str=substr($str2,0,$ex_info['str2_left']);
		if ($str1_left_str&&$str2_left_str) {
			$strleft=check_str($str1_left_str,$str2_left_str);
			if ($strleft) {
				$res_arr=array_merge($res_arr,$strleft);
			}
		}
		if ($str_temp) {
			$res_arr=array_merge($res_arr,array($str_temp));
		}

		$str1_right_str=mb_substr($str1, $ex_info['str1_left']+$ex_info['str1_right'], utf8_strlen($str1), 'utf-8');
		$str2_right_str=substr($str2,$ex_info['str2_right'],strlen($str2));
		if ($str1_right_str&&$str2_right_str) {
			$strright=check_str($str1_right_str,$str2_right_str);
			if ($strright) {
				$res_arr=array_merge($res_arr,$strright);
			}
		}
	}
	return $res_arr;
	
}
//改变样式
function str_color($str1,$str2,$arr){
	foreach ($arr as $key => $value) {
		$start1=strpos($str1,$value);
		$str1=substr_replace($str1, '---$'.$key.'$', $start1,strlen($value));
		$start2=strpos($str2,$value);
		$str2=substr_replace($str2, '---', $start2,strlen($value));
	}
	$arr1_temp=explode('---', $str1);
	$arr2_temp=explode('---', $str2);
	$temp_arr=array();
	foreach ($arr1_temp as $key => $value) {
		$check=preg_replace('/^\$(\d+)\$$/', '', $value);
		if (strlen($check)&&strlen($arr2_temp[$key])) {
			$temp_arr[]='<font color="pink">'.$value.'</font>'.'<font color="#C1CDCD">'.$arr2_temp[$key].'</font>';//修改
		}elseif(strlen($check)){
			$temp_arr[]='<font color="#BFEFFF">'.$value.'</font>';//新加的
		}elseif(strlen($arr2_temp[$key])){
			$temp_arr[]='<font color="red">'.$value.$arr2_temp[$key].'</font>';//删除的
		}else {
			$temp_arr[]=$value;
		}
	}
	$temp_arr=preg_replace_callback('/(.*)(\$(\d+)\$)(.*)/', function ($matchs) use($arr){
		return $arr[$matchs[3]].$matchs[1].$matchs[4];
	}, $temp_arr);
	return implode('', $temp_arr);
}
echo(str_color($str2,$str1,check_str($str1,$str2)));
?>

优化了下上面的函数

文章地址

http://blog.csdn.net/scchary/article/details/45337729


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值