1

我只需要允许名称中的字母和数字,但字母必须是 UTF-8,因为它将用于德语、西班牙语和其他语言

我的代码抛出 UTF-8 字符,如何解决?谢谢

$title = 'aj,o!_-z5ąśäżźŠń?56';

echo preg_replace('/[^A-z0-9-]/', '_', $title);
4

1 回答 1

4

第一的,

[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就足够了。

于 2013-04-03T21:41:22.023 回答