PHP如何拆分含多词分类名的字符串为保留分类项的数组?
最优实现方案:正则匹配+优先级排序
直接上可运行的PHP代码,完美解决你的需求:
<?php // 你的原始数据 $content = "lorem ipsum bla bla bla cat1 bla bla bla kids and baby"; $categories_array = ["cat1", "kids and baby", "cat3"]; // 步骤1:按分类长度降序排序——确保多词分类优先被匹配,避免被拆成单个单词 usort($categories_array, function($a, $b) { return strlen($b) - strlen($a); }); // 步骤2:转义分类中的正则特殊字符(比如.、*、+这类),防止正则语法错误 $escaped_categories = array_map(function($category) { return preg_quote($category, '/'); }, $categories_array); // 步骤3:构建正则模式——要么匹配完整的分类项,要么匹配单个非空白单词 $pattern = '/(' . implode('|', $escaped_categories) . '|\S+)/'; // 步骤4:全局匹配所有符合规则的内容 preg_match_all($pattern, $content, $matches); // 最终结果 $content_array = $matches[0]; // 输出测试 print_r($content_array); ?>
运行结果(完全符合你的期望):
Array ( [0] => lorem [1] => ipsum [2] => bla [3] => bla [4] => bla [5] => cat1 [6] => bla [7] => bla [8] => bla [9] => kids and baby )
为什么这是最优方案?
- 效率极高:仅需一次正则扫描即可完成拆分,避免了循环查询分类的资源消耗问题。
- 彻底解决多词分类拆分问题:通过按分类长度降序排序,让长的多词分类优先被匹配,不会被拆分成单个单词(比如"kids and baby"会被完整识别,而不是拆成"kids"、"and"、"baby")。
- 鲁棒性强:用
preg_quote转义正则特殊字符,即使分类里包含.、*、+这类特殊符号,也不会导致正则报错。 - 代码简洁:逻辑清晰,没有复杂的字符串拼接或循环判断,维护成本低。
边缘情况处理
如果你的分类中存在重叠项(比如同时有"baby"和"kids and baby"),排序逻辑会优先匹配更长的"kids and baby",完全符合预期;如果分类包含标点符号或特殊字符,preg_quote会自动转义,保证正则正常工作。
内容的提问来源于stack exchange,提问作者Alphabetus
相关产品推荐
相关产品推荐

