php preg_replace 函数错误结果

php preg_replace function wrong result

我正在尝试从给定 $_POST 字符串的用户中删除(大多数)特殊字符,然后再将其插入数据库,使用以下 preg_replace 函数:

preg_replace('/[^a-zA-Z0-9\-._äöü]/', '', $description);

现在,当为 $description 输入此内容时:

abc !"§$%&/()=?`*'#+´ß

结果是:

?

为什么函数删除了 abc,但保留了 '?',它不在我 preg_replace 的白名单中? 非常感谢任何答案。

您可以使用 '/\W/' 将删除所有特殊字符:

<?php
$string = 'abc !"§$%&/()=?*#+´ß';
echo preg_replace('/\W/', '', $string); // abc
?>

PHP 应配置为 UTF-8。设置 default_charset INI option to 'UTF-8'; use the u pattern modifier:

ini_set('default_charset', 'UTF-8');
$description = 'abc !"§$%&/()=?`*\'#+´ß.';
$r = preg_replace('/[^a-zA-Z0-9\-\._äöü]/u', '', $description);
var_dump($r);

示例输出

string(4) "abc."

此外,考虑设置 UTF-8 区域设置,因为 basename 等函数是区域设置感知的:

setlocale(LC_ALL,
  'de_DE.UTF-8',
  'de_DE.utf8',
  'en_US.UTF-8',
  'en_US.utf8'
);
function clean($string) {
   $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.

   return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}

使用方法:

echo clean('a|"bc!@£de^&$f g');