PHP去除特殊字符问题:禁用preg_replace/str_replace的解决方案
解决方案
方案1:正则保留允许的字符
既然无法预定义要去除的特殊字符,我们可以反过来只保留需要的字符(比如英文字母),用preg_replace匹配所有非字母的字符并替换为空。这种方式不需要提前知道所有要去除的字符,完全符合需求:
$name = "Test ½ ´ ¤ £ € ¨"; $clean_name = preg_replace('/[^a-zA-Z]/', '', $name); echo $clean_name; // 输出:Test
如果需要保留空格,只需把正则表达式改为/[^a-zA-Z\s]/即可。
方案2:遍历字符过滤
如果你不想使用正则,可以通过遍历每个字符,检查其ASCII值是否属于英文字母范围(A-Z:65-90,a-z:97-122),只保留符合条件的字符:
$name = "Test ½ ´ ¤ £ € ¨"; $clean_name = ''; $char_count = mb_strlen($name); for ($i = 0; $i < $char_count; $i++) { $current_char = mb_substr($name, $i, 1); $ascii_code = ord($current_char); // 判断是否为英文字母 if (($ascii_code >= 65 && $ascii_code <= 90) || ($ascii_code >= 97 && $ascii_code <= 122)) { $clean_name .= $current_char; } } echo $clean_name; // 输出:Test
补充说明
你之前尝试的mb_convert_encoding和utf8_decode是编码转换工具,它们的作用是改变字符的编码格式,而非过滤特定字符,所以无法解决你的问题。
内容的提问来源于stack exchange,提问作者Brian Nowlan
相关产品推荐
相关产品推荐

