程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 分析PHP的similar_text函數

分析PHP的similar_text函數

編輯:PHP綜合

//比較字串,返回兩個字串第一個相同字符的區域
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);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved