如何从多个差异字符串中提取公共内容以生成统一的产品基准标题
如何从多个差异字符串中提取公共内容以生成统一的产品基准标题
看起来你已经找对了方向,但卡在了按字符对比的误区里——你的思路是对的,但应该按「词」而不是单个字符来拆分对比,这样就能避开字符重复导致的混乱结果。
先说说你的问题核心:你需要从所有产品标题中提取所有字符串都包含的词单元,并且保留它们的原始顺序,去掉那些只出现在部分标题里的差异内容(比如颜色、附加描述)。
正确的实现步骤
我给你整理一个通用、高效的方案,适配任意数量的输入字符串(只要≥1),而且逻辑清晰:
1. 预处理与拆分字符串
首先把每个标题拆分成「词单元」,这里要先统一格式:清理多余空格、处理特殊符号(可选,根据你的需求调整),然后按空格拆分。这样每个标题都会变成一个词数组,方便后续对比。
2. 提取所有标题的公共词
用PHP的array_intersect结合call_user_func_array来处理任意数量的词数组——array_intersect可以找出所有数组的公共元素,而call_user_func_array能把你的词数组列表作为参数传递进去,解决数量可变的问题,不用硬编码数组索引。
3. 拼接成最终基准标题
把提取到的公共词按原始顺序拼接成字符串,就是你要的基准标题了。
完整代码示例
针对你给出的测试数据,代码如下:
<?php $test = array( 'Super red Megaman T-shirt', 'Super Megaman blue T-shirt', 'Super black Megaman T-shirt', 'Super Megaman T-shirt - aquamarine', ); // 1. 预处理并拆分每个标题为词数组 $wordArrays = array_map(function($str) { // 可选:统一处理特殊符号,这里保留连字符、字母数字和空格 $cleanStr = preg_replace('/[^\w\s-]/', ' ', $str); // 替换多空格为单空格,去除首尾空格 $cleanStr = preg_replace('/\s+/', ' ', trim($cleanStr)); // 按空格拆分 return preg_split('/\s+/', $cleanStr); }, $test); // 2. 提取所有数组的公共词(适配任意数量的输入字符串) if (count($wordArrays) === 0) { $commonTitle = ''; } else { $commonWords = call_user_func_array('array_intersect', $wordArrays); // 3. 拼接成最终标题 $commonTitle = implode(' ', $commonWords); } echo $commonTitle; // 输出:Super Megaman T-shirt ?>
为什么这个方案比你的原方法好?
- 按词对比而非字符:彻底解决了字符重复导致的错误(比如原方法里的「re」残留),直接针对有意义的词单元对比,结果更准确。
- 适配任意数量的输入:不管是2个还是6个标题,
call_user_func_array都能自动处理,不需要修改代码适配数量。 - 可灵活调整预处理规则:如果你的标题有其他特殊格式(比如斜杠、括号),只需要修改预处理里的正则就能快速适配。
边缘情况的优化建议
- 词顺序不一致的情况:如果某个标题的核心词顺序颠倒了(比如「Megaman Super T-shirt」),
array_intersect会保留第一个标题的词顺序。如果需要更严格的顺序一致性,可以额外检查公共词在所有数组中的出现顺序,不过考虑到你是做产品标题的基准,核心词顺序应该是统一的,这个情况可能很少见。 - 重复词的情况:如果某个标题里有重复的核心词(比如「Super Super Megaman T-shirt」),最终结果会保留重复的词。如果你想去重,可以在拼接前对
$commonWords做处理:$commonWords = array_values(array_unique($commonWords));(array_values是为了重新整理索引,避免拼接时出现空值)。 - 大小写不一致:如果标题有大小写差异(比如「super Megaman」和「Super megaman」),可以在预处理时统一转成小写或大写,对比完成后再还原成第一个标题的大小写(或者统一格式)。
这个方案应该完全满足你的需求——既高效,又能处理大多数实际场景,而且省了你大量手动调整的时间~
内容来源于stack exchange
相关产品推荐
相关产品推荐

