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');
我正在尝试从给定 $_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');