PHP移除字符串中的度符号:解决Unicode显示异常问题
解决方案
你的问题出在两处:一是原正则/[^\x20-\x7E]/只能过滤实际的非ASCII字符,但输出里的\u00b0是ASCII组成的转义文本(\、u、数字都是ASCII范围内),所以不会被过滤;二是度符号可能存在多种Unicode变体(比如U+00B0、U+2103、U+2109等),需要统一匹配替换。
根据你的场景,提供两种针对性方案:
方案1:直接匹配转义序列\u00b0
如果数据库存储的是带转义的\u00b0文本(如示例输出所示),直接正则匹配该转义字符串并替换为空格:
foreach ($video as $desc) { if (preg_match('/\/(.*?)"E/', $desc, $match) == 1) { // 匹配大小写的\u00b0转义序列,替换为空格 $test = preg_replace('/\\\u00b0/i', ' ', $match[1]); echo $test; } }
方案2:解析转义序列后替换所有度符号变体
如果需要兼容实际Unicode度符号(而非转义文本),先把转义序列解析为真实Unicode字符,再匹配所有常见度符号替换:
foreach ($video as $desc) { if (preg_match('/\/(.*?)"E/', $desc, $match) == 1) { // 解析转义序列为真实Unicode字符 $decoded = json_decode('"' . $match[1] . '"'); // 匹配所有度相关Unicode符号(U+00B0普通度、U+2103摄氏度、U+2109华氏度等) $test = preg_replace('/[\x{00B0}\x{2103}\x{2109}\x{00BA}]/u', ' ', $decoded); echo $test; } }
补充说明
如果替换后还需要移除其他非ASCII字符,可以在替换度符号后追加原过滤逻辑:
$test = preg_replace('/[^\x20-\x7E]/', '', $test);
内容的提问来源于stack exchange,提问作者lol69
相关产品推荐
相关产品推荐

