1
我需要允许在名称只有字母和数字,但字母必须是UTF-8,因为这将在德语,西班牙语等多国语言preg_replace函数使用UTF-8字母
我的代码抛出UTF-8字符使用,如何解决它? 由于
$title = 'aj,o!_-z5ąśäżźŠń?56';
echo preg_replace('/[^A-z0-9-]/', '_', $title);
我需要允许在名称只有字母和数字,但字母必须是UTF-8,因为这将在德语,西班牙语等多国语言preg_replace函数使用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编号)或\p{Nd}
(Unicode十进制数字),但我很肯定\d
就足够了。