PHP similar_text() 函数(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言:理解字符串相似度在编程中的重要性

在编程开发中,字符串的比较和分析是一项基础但极其重要的任务。无论是用户输入验证、数据清洗,还是自然语言处理(NLP),开发者都需要快速判断两个字符串之间的相似程度。PHP 提供的 similar_text() 函数,正是这样一个高效且直观的工具。它通过计算两个字符串的相似度百分比,帮助开发者快速实现模糊匹配、去重或纠错等功能。本文将从零开始,逐步解析 similar_text() 函数的用法、原理和应用场景,帮助读者掌握这一实用技能。


函数基础:语法与核心参数解析

基础语法与返回值

similar_text() 函数的基本语法如下:

similar_text(string $first, string $second, float &$percent = null): int  
  • 参数说明
    • $first$second 是需要比较的两个字符串。
    • $percent 是一个可选的输出参数,用于存储两个字符串的相似度百分比(范围 0-100)。
  • 返回值:函数返回两个字符串的匹配字符数(整数),若需百分比则通过 $percent 获取。

示例 1:基础用法

$string1 = "Hello World";  
$string2 = "Hello PHP";  

similar_text($string1, $string2, $percent);  

echo "匹配字符数:" . similar_text($string1, $string2) . PHP_EOL;  
echo "相似度百分比:" . $percent . "%";  

输出结果:

匹配字符数:9  
相似度百分比:64.285714285714%  

解析
两个字符串的前 9 个字符("Hello Wo")完全匹配,但后半部分差异较大,因此百分比约为 64.29%。


参数详解:百分比计算与大小写敏感

百分比计算的数学逻辑

相似度百分比的计算公式为:

百分比 = (匹配字符数 / 最长字符串长度) × 100  

例如,若字符串 A 的长度为 10,字符串 B 的长度为 15,匹配字符数为 8,则百分比为 (8/15)×100 ≈ 53.33%

大小写敏感问题

默认情况下,similar_text() 是大小写敏感的。例如:

$stringA = "PHP";  
$stringB = "php";  
similar_text($stringA, $stringB, $percent);  
echo $percent; // 输出:0%  

若需忽略大小写,可先将字符串统一转为小写或大写:

similar_text(strtolower($stringA), strtolower($stringB));  

实际案例:从简单到复杂的应用场景

案例 1:用户输入纠错

假设用户在搜索框输入 "pho tosh op",但实际应为 "photoshop"。通过 similar_text() 可快速判断输入是否接近目标关键词:

$searchTerm = "pho tosh op";  
$target = "photoshop";  

similar_text($searchTerm, $target, $percent);  

if ($percent >= 70) {  
    echo "您可能想搜索:photoshop";  
}  

案例 2:数据去重与相似内容识别

在内容管理系统(CMS)中,可使用该函数检测文章标题的重复率:

$titles = [  
    "PHP 开发入门指南",  
    "PHP 初学者教程",  
    "PHP 入门指南完全版",  
];  

foreach ($titles as $title1) {  
    foreach ($titles as $title2) {  
        if ($title1 === $title2) continue;  
        similar_text($title1, $title2, $percent);  
        if ($percent > 80) {  
            echo "$title1 和 $title2 可能重复(相似度 $percent%)";  
        }  
    }  
}  

进阶技巧:与相似函数对比与优化

对比 levenshtein() 函数

levenshtein() 计算两个字符串的编辑距离(即需要修改的最少字符数),而 similar_text() 直接输出相似度百分比。两者互补,适用于不同场景:

// 计算编辑距离  
echo levenshtein("kitten", "sitting"); // 输出:3(替换k→s,e→i,结尾加g)  

// 计算相似度  
similar_text("kitten", "sitting", $percent); // 约 57.14%  

性能优化建议

  • 预处理字符串:去除空格、标点符号或统一编码格式后再比较。
  • 阈值控制:根据业务需求设置合理的相似度阈值(如 70% 以上才视为匹配)。

常见问题与解决方案

Q1:为什么匹配字符数可能超过最长字符串的长度?

解答
当两个字符串长度相等且完全匹配时,匹配字符数等于字符串长度。若存在跨位置匹配(如 "abc" 和 "cba"),算法会寻找最优匹配路径,可能导致总匹配数超过单个字符串长度。

Q2:如何处理中文字符串的比较?

解答
中文字符的比较与英文相同,但需确保字符串编码为 UTF-8。例如:

similar_text("你好PHP", "你好Python", $percent); // 输出约 66.67%  

Q3:能否返回更详细的匹配信息?

解答
PHP 本身不提供,但可通过第三方库(如 similar_text_extended)获取匹配位置或高亮显示。


结论:善用字符串相似度提升开发效率

通过掌握 similar_text() 函数,开发者可以轻松实现模糊搜索、数据清洗和内容去重等实用功能。本文从基础语法到实际案例,结合形象的比喻(如“DNA匹配度”),逐步展示了该函数的核心逻辑和应用场景。建议读者在项目中尝试以下实践:

  1. 结合 strtolower() 忽略大小写差异;
  2. 通过循环批量比较字符串集合;
  3. 将相似度阈值与业务场景结合(如用户密码校验、内容推荐)。

未来,随着自然语言处理技术的普及,字符串相似度算法将在推荐系统、智能纠错等领域发挥更大作用。希望本文能帮助读者在 PHP 开发中更自信地运用这一工具。

最新发布