| 订阅 | 在线投稿
分享
 
 
当前位置: 王朝网络 >> php >> 分析PHP的similar_text函数 fen xi PHP de similar_text han shu
 

分析PHP的similar_text函数

2008-12-22 08:09:22 编辑來源:互联网 繁體版 评论
 
 
本文为【分析PHP的similar_text函数】的汉字拼音对照版显示拼音
  //bijiaozichuan,fanhuilianggezichuandiyigexiangtongzifudequyu

  static void php_similar_str(const char *txt1, int len1, const char *txt2, int len2, int *pos1, int *pos2, int *max)

  {

  char *p, *q;

  char *end1 = (char *) txt1 + len1;

  char *end2 = (char *) txt2 + len2;

  int l;

  *max = 0;

  //bianlizichuan

  for (p = (char *) txt1; p < end1; p++) {

   for (q = (char *) txt2; q < end2; q++) {

   for (l = 0; (p + l < end1) && (q + l < end2) && (p[l] == q[l]); l++);

   if (l > *max) {

   //baocunxiangtongquyuxinxi

   *max = l;

   *pos1 = p - txt1;

   *pos2 = q - txt2;

   }

   }

  }

  }

  //diguihanshu,bijiaotxt1hetxt2dexiangtongzifushuliang

  static int php_similar_char(const char *txt1, int len1, const char *txt2, int len2)

  {

  int sum;

  int pos1, pos2, max;

  php_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &max);

  if ((sum = max)) {//zheyangxieyoushenmeyiyi?????!!!!!

   //diguishangcibutongbufendeqianbu

   if (pos1 && pos2) {

   sum += php_similar_char(txt1, pos1, txt2, pos2);

   }

   //diguishangcibutongbufendehoubu

   if ((pos1 + max < len1) && (pos2 + max < len2)) {

   sum += php_similar_char(txt1 + pos1 + max, len1 - pos1 - max,

   txt2 + pos2 + max, len2 - pos2 - max);

   }

  }

  //fanhuibencibijiaohoudexiangtongzifushuliang

  return sum;

  }

  //PHPhanshubenshenyiduihongzuolexiechuanzhuanhuanhefanhuizhihuansuan,zhugongnengyoushangmianlianggehanshuzuole

  PHP_FUNCTION(similar_text)

  {

  zval **t1, **t2, **percent;

  int ac = ZEND_NUM_ARGS();

  int sim;

  if (ac < 2 || ac > 3 || zend_get_parameters_ex(ac, &t1, &t2, &percent) == FAILURE) {

   WRONG_PARAM_COUNT;

  }

  convert_to_string_ex(t1);

  convert_to_string_ex(t2);

  if (ac > 2) {

   convert_to_double_ex(percent);

  }

  if (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2) == 0) {

   if (ac > 2) {

   Z_DVAL_PP(percent) = 0;

   }

   RETURN_LONG(0);

  }

  sim = php_similar_char(Z_STRVAL_PP(t1), Z_STRLEN_PP(t1), Z_STRVAL_PP(t2), Z_STRLEN_PP(t2));

  if (ac > 2) {

   Z_DVAL_PP(percent) = sim * 200.0 / (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2));

  }

  RETURN_LONG(sim);

  }

  suoyoukanchusimilar_textshigenjuASCIIzuobijiaodeshibukaolvcizuwentide

  ceshileyixiajieguoruxia

  int main(int argc, char *argv[])

  {

   char *str1="weican wuxin";

   char *str2="wuxin weican";

   int pos1,pos2,max;

   php_similar_str(str1,strlen(str1),str2,strlen(str2),&pos1,&pos2,&max);

   printf("php_similar_str:%d,%d=%d\n",pos1,pos2,max);

   max=php_similar_char(str1,strlen(str1),str2,strlen(str2));

   printf("php_similar_char:%d\n",max);

   system("PAUSE");

   return 0;

  }

  php_similar_str:0,6=6

  php_similar_char:6

  char *str1="TCPxieyitongxungongzuoyuanali";

  char *str2="TCPaxieyitongxungongzuoyuanli";

  php_similar_str:3,4=14

  php_similar_char:19原文】【拼音
 
 
 
 
上一篇《不需要mod_rewrite直接使用php实现伪静态化页面》
下一篇《在PHP中使用Sockets:从Usenet中获取文件》
 
 
 
 
 
 
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

如何磨出破洞牛仔裤?牛仔裤怎么剪破洞?

把牛仔裤磨出有线的破洞 1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...

我就是扫描下图得到了敬业福和爱国福

先来看下敬业福和爱国福 今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。 今天该活动正式启动,和去年一样,需要收集“五福”...

冰箱异味产生的原因和臭味去除的方法

有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。 1、很多人有这种习...

 
 
//比较字串,返回两个字串第一个相同字符的区域 static void php_similar_str(const char *txt1, int len1, const char *txt2, int len2, int *pos1, int *pos2, int *max) { char *p, *q; char *end1 = (char *) txt1 + len1; char *end2 = (char *) txt2 + len2; int l; *max = 0; //遍历字串 for (p = (char *) txt1; p < end1; p++) { for (q = (char *) txt2; q < end2; q++) { for (l = 0; (p + l < end1) && (q + l < end2) && (p[l] == q[l]); l++); if (l > *max) { //保存相同区域信息 *max = l; *pos1 = p - txt1; *pos2 = q - txt2; } } } } //递归函数,比较txt1和txt2的相同字符数量 static int php_similar_char(const char *txt1, int len1, const char *txt2, int len2) { int sum; int pos1, pos2, max; php_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &max); if ((sum = max)) {//这样写有什么意义?????!!!!! //递归上次不同部分的前部 if (pos1 && pos2) { sum += php_similar_char(txt1, pos1, txt2, pos2); } //递归上次不同部分的后部 if ((pos1 + max < len1) && (pos2 + max < len2)) { sum += php_similar_char(txt1 + pos1 + max, len1 - pos1 - max, txt2 + pos2 + max, len2 - pos2 - max); } } //返回本次比较后的相同字符数量 return sum; } //PHP函数本身,一堆宏,做了些串转换和返回值换算,主功能由上面两个函数做了。 PHP_FUNCTION(similar_text) { zval **t1, **t2, **percent; int ac = ZEND_NUM_ARGS(); int sim; if (ac < 2 || ac > 3 || zend_get_parameters_ex(ac, &t1, &t2, &percent) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(t1); convert_to_string_ex(t2); if (ac > 2) { convert_to_double_ex(percent); } if (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2) == 0) { if (ac > 2) { Z_DVAL_PP(percent) = 0; } RETURN_LONG(0); } sim = php_similar_char(Z_STRVAL_PP(t1), Z_STRLEN_PP(t1), Z_STRVAL_PP(t2), Z_STRLEN_PP(t2)); if (ac > 2) { Z_DVAL_PP(percent) = sim * 200.0 / (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2)); } RETURN_LONG(sim); } 所有看出similar_text是根据ASCII做比较的,是不考虑词组问题的。 测试了一下,结果如下: int main(int argc, char *argv[]) { char *str1="weican wuxin"; char *str2="wuxin weican"; int pos1,pos2,max; php_similar_str(str1,strlen(str1),str2,strlen(str2),&pos1,&pos2,&max); printf("php_similar_str:%d,%d=%d\n",pos1,pos2,max); max=php_similar_char(str1,strlen(str1),str2,strlen(str2)); printf("php_similar_char:%d\n",max); system("PAUSE"); return 0; } php_similar_str:0,6=6 php_similar_char:6 char *str1="TCP协议通讯工作原a理"; char *str2="TCPa协议通讯工作原理"; php_similar_str:3,4=14 php_similar_char:19
󰈣󰈤
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
时尚秀气模特裴裴(8)
时尚秀气模特裴裴(7)
时尚秀气模特裴裴(6)
时尚秀气模特裴裴(5)
白墙黑瓦
广州东郊[原创]
八美至丹巴的东谷天然盆景
不一样的
 
>>返回首页<<
 
 
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 热帖排行
 
 
 
 
©2005- 王朝网络 版权所有