//เปรียบเทียบสตริงและส่งคืนพื้นที่ที่อักขระตัวแรกของทั้งสองสตริงเหมือนกัน
โมฆะคงที่ php_similar_str (const char * txt1, int len1, const char * txt2, int len2, int * pos1, int * pos2, int * สูงสุด)
-
ถ่าน *p, *q;
ถ่าน *end1 = (ถ่าน *) txt1 + len1;
ถ่าน *end2 = (ถ่าน *) txt2 + len2;
int l;
*สูงสุด = 0;
// วนซ้ำผ่านสตริง
สำหรับ (p = (ถ่าน *) txt1; p < end1; p++) {
สำหรับ (q = (ถ่าน *) txt2; q < end2; q ++) {
สำหรับ (l = 0; (p + l < end1) && (q + l < end2) && (p[l] == q[l]); l++);
ถ้า (l > *สูงสุด) {
//บันทึกข้อมูลพื้นที่เดียวกัน
*สูงสุด = ลิตร;
*pos1 = p - txt1;
*pos2 = q - txt2;
-
-
-
}
//ฟังก์ชัน Recursive เปรียบเทียบจำนวนอักขระเดียวกันใน txt1 และ txt2
int คงที่ php_similar_char (const char * txt1, int len1, const char * txt2, int len2)
-
ผลรวมจำนวนเต็ม;
int pos1, pos2, สูงสุด;
php_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &สูงสุด);
if ((sum = max)) {//การเขียนแบบนี้มีความหมายอะไรคะ????!!!!!!
//เรียกคืนส่วนหน้าของส่วนต่างๆ ครั้งที่แล้ว
ถ้า (pos1 && pos2) {
ผลรวม += php_similar_char(txt1, pos1, txt2, pos2);
}
//เรียกคืนส่วนสุดท้ายของส่วนต่างๆ
ถ้า ((pos1 + สูงสุด < len1) && (pos2 + สูงสุด < len2)) {
ผลรวม += php_similar_char (txt1 + pos1 + สูงสุด, len1 - pos1 - สูงสุด,
txt2 + pos2 + สูงสุด, len2 - pos2 - สูงสุด);
-
}
//ส่งคืนจำนวนอักขระที่เหมือนกันหลังจากการเปรียบเทียบนี้
จำนวนเงินที่ส่งคืน;
}
//ฟังก์ชัน PHP เองซึ่งเป็นกลุ่มของมาโคร ทำการแปลงสตริงและการแปลงค่าส่งคืน และฟังก์ชันหลักจะกระทำโดยฟังก์ชันทั้งสองข้างต้น
PHP_FUNCTION(ข้อความที่คล้ายกัน)
-
zval **t1, **t2, **เปอร์เซ็นต์;
intac = ZEND_NUM_ARGS();
ซิมอินท์;
ถ้า (ac < 2 || ac > 3 || zend_get_parameters_ex (ac, &t1, &t2, &เปอร์เซ็นต์) == ความล้มเหลว) {
WRONG_PARAM_COUNT;
}
Convert_to_string_ex(t1);
Convert_to_string_ex(t2);
ถ้า (ac > 2) {
Convert_to_double_ex(เปอร์เซ็นต์);
-
ถ้า (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2) == 0) {
ถ้า (ac > 2) {
Z_DVAL_PP(เปอร์เซ็นต์) = 0;
}
RETURN_LONG(0);
-
sim = php_similar_char(Z_STRVAL_PP(t1), Z_STRLEN_PP(t1), Z_STRVAL_PP(t2), Z_STRLEN_PP(t2))
;
Z_DVAL_PP(เปอร์เซ็นต์) = ซิม * 200.0 / (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2));
}
RETURN_LONG(ซิม);
-
จะเห็นได้ว่ามีการเปรียบเทียบlike_textตาม ASCII และไม่พิจารณาปัญหาวลี
ฉันทดสอบแล้วและผลลัพธ์เป็นดังนี้:
int main(int argc, char *argv[])
-
ถ่าน *str1="weican wuxin";
ถ่าน *str2="wuxin weican";
int pos1,pos2,สูงสุด;
php_similar_str(str1,strlen(str1),str2,strlen(str2),&pos1,&pos2,&สูงสุด);
printf("php_similar_str:%d,%d=%dn",pos1,pos2,สูงสุด);
สูงสุด=php_similar_char(str1,strlen(str1),str2,strlen(str2));
printf("php_similar_char:%dn",สูงสุด);
ระบบ("หยุดชั่วคราว");
กลับ 0;
}
php_similar_str:0,6=6
php_similar_char:6
char *str1="หลักการทำงานของการสื่อสารโปรโตคอล TCP a";
char *str2="หลักการทำงานของการสื่อสารโปรโตคอล TCP";
php_similar_str:3,4=14
php_similar_char:19