PHP正则处理文本时误删句号逗号等标点符号该如何解决?
问题原因
你的代码有两处核心问题导致标点丢失、逻辑存在隐患:
- 执行
$word = preg_replace('/[^\w]/uis', '', $word);时直接覆盖了原单词变量,所有非单词字符(包括句号、逗号等标点)都会被直接删除,输出时自然没有标点。 - 初始变量名冲突:你一开始将过敏原数组命名为
$words,后续又用explode的返回值覆盖了$words,会导致过敏原列表丢失,匹配逻辑失效。
修复方案
方案1:原有代码最小改动
仅调整变量逻辑,不改变你原有的拆分遍历思路:
// 修正变量名冲突,过敏原数组单独命名 $allergens = ['mleko', 'masło']; $words = explode(' ', $value); $return = ''; foreach($words as $word) { // 单独生成清洗后的纯文本用于匹配,不修改原单词内容 $cleanWord = preg_replace('/[^\w]/uis', '', $word); if (in_array(mb_strtolower($cleanWord), $allergens)) { // 仅把单词本身加粗,保留前后标点 $processedWord = preg_replace('/('.preg_quote($cleanWord, '/').')/uis', '<b>$1</b>', $word); $return .= $processedWord . ' '; } else { $return .= $word . ' '; } } // 去除末尾多余的空格 $return = rtrim($return);
方案2:更简洁的优化实现
不用手动按空格拆分,直接用正则回调处理所有文本,标点、空格会完全保留,逻辑更严谨:
$allergens = ['mleko', 'masło']; $return = preg_replace_callback('/\p{L}+/uis', function($matches) use ($allergens) { $word = $matches[0]; if (in_array(mb_strtolower($word), $allergens)) { return "<b>{$word}</b>"; } return $word; }, $value);
内容的提问来源于stack exchange,提问作者terylo
相关产品推荐
相关产品推荐

