PHP:如何根据文章标题匹配多分类?最优实现方案咨询
针对文章多分类分配的最佳实践
嘿,这个问题我刚好有不少实践经验,咱们来捋一捋~
首先得明确你的核心需求:单篇文章可能匹配多个关键词,对应多个分类,基于这个前提,先分析你提到的两种方案,再说说更优的实践方式:
为什么不推荐用无break的switch?
switch本质是基于「精确值匹配」的语法,而你的需求是「检测标题是否包含某个关键词」——这是一种条件判断,不是值相等判断。
强行用switch的话,你可能得写成这样:
function assignCategories(title) { const categories = []; switch(true) { case title.includes("科技"): categories.push("科技"); case title.includes("人工智能"): categories.push("人工智能"); // 更多case... } return categories; }
这种写法不仅别扭,可读性极差,而且一旦关键词变多,维护起来会非常头疼,完全没必要。
多个连续if的可行性
这种方案是可行的,每个if独立判断标题是否包含对应关键词,匹配就添加分类:
function assignCategories(title) { const categories = []; if (title.includes("科技")) { categories.push("科技"); } if (title.includes("人工智能")) { categories.push("人工智能"); } if (title.includes("前端")) { categories.push("前端"); } // 更多判断... return categories; }
逻辑清晰,符合你「多分类」的需求,因为每个if都会执行,不会因为匹配了一个就跳过其他条件。但缺点是,如果关键词和分类的映射变多,函数里会塞满一堆if,维护成本会越来越高。
更优的最佳实践:配置数组+遍历
这才是我最推荐的方式——把关键词和分类的映射做成一个配置数组,然后通过遍历完成匹配,代码既简洁又易于维护:
基础版(精准匹配关键词)
// 把所有关键词-分类的映射统一放在这里,配置和逻辑分离 const keywordCategoryMap = [ { keyword: "科技", category: "科技" }, { keyword: "人工智能", category: "人工智能" }, { keyword: "前端", category: "前端" }, { keyword: "Vue", category: "前端框架" }, // 新增/修改只需要在这里加行就行 ]; function assignCategories(title) { return keywordCategoryMap .filter(item => title.includes(item.keyword)) .map(item => item.category); }
进阶版(支持正则模糊匹配)
如果需要更灵活的匹配(比如同义词、模糊匹配),把关键词换成正则表达式即可:
const keywordCategoryMap = [ { keyword: /科技|技术|科创/, category: "科技" }, { keyword: /人工智能|AI|机器学习/, category: "人工智能" }, { keyword: /前端|Web|HTML/, category: "前端" }, ]; function assignCategories(title) { return keywordCategoryMap .filter(item => item.keyword.test(title)) .map(item => item.category); }
这种方式的优势:
- 可维护性高:新增或修改分类规则,只需要修改配置数组,不用动核心逻辑代码;
- 扩展性强:后续要支持权重、排除规则等,只需要在配置里加字段,调整遍历逻辑即可;
- 可读性好:一眼就能看到所有的关键词-分类对应关系。
总结
- ❌ 不推荐switch:不适合「包含判断」的多条件场景,强行使用会导致代码冗余、可读性差;
- ✅ 多个if可行:适合关键词较少的场景,但关键词多了维护麻烦;
- ✅✅ 最佳实践:配置数组+遍历,兼顾可读性、可维护性和扩展性,完美匹配你的多分类需求。
内容的提问来源于stack exchange,提问作者szef0
相关产品推荐
相关产品推荐

