You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP正则处理文本时误删句号逗号等标点符号该如何解决?

问题原因

你的代码有两处核心问题导致标点丢失、逻辑存在隐患:

  1. 执行$word = preg_replace('/[^\w]/uis', '', $word);时直接覆盖了原单词变量,所有非单词字符(包括句号、逗号等标点)都会被直接删除,输出时自然没有标点。
  2. 初始变量名冲突:你一开始将过敏原数组命名为$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:18:00