我只需要允许名称中的字母和数字,但字母必须是 UTF-8,因为它将用于德语、西班牙语和其他语言
我的代码抛出 UTF-8 字符,如何解决?谢谢
$title = 'aj,o!_-z5ąśäżźŠń?56';
echo preg_replace('/[^A-z0-9-]/', '_', $title);
我只需要允许名称中的字母和数字,但字母必须是 UTF-8,因为它将用于德语、西班牙语和其他语言
我的代码抛出 UTF-8 字符,如何解决?谢谢
$title = 'aj,o!_-z5ąśäżźŠń?56';
echo preg_replace('/[^A-z0-9-]/', '_', $title);
第一的,
[A-z]
是一个错误。A-z
永远不要在字符类中使用范围。
它匹配与 相同的字符[A-Za-z]
,加上几个代码点恰好位于Z
和之间的特殊字符a
。如果您真的只想匹配 ASCII 字母,您可以使用[A-Za-z]
, 或[A-Z]
设置“不区分大小写”标志。
至于你的问题,我认为这就是你要找的:
echo preg_replace('/[^\p{L}\d-]/u', '_', $title);
该/u
标志告诉它将正则表达式和源字符串视为 UTF-8,它允许您像\p{L}
在正则表达式中一样使用 Unicode 属性。 \d
只是一种更紧凑的匹配方式[0-9]
(ASCII十进制数字)。根据您的需要,您可能想要使用\p{N}
(Unicode numbers) 或\p{Nd}
(Unicode decimal digits),但我很确定\d
就足够了。