2013-04-03 41 views
1

我需要允许在名称只有字母和数字,但字母必须是UTF-8,因为这将在德语,西班牙语等多国语言preg_replace函数使用UTF-8字母

我的代码抛出UTF-8字符使用,如何解决它? 由于

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

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

回答

2

首先,

[A-z]是错误的。千万不要在字符类中使用范围A-z

它同样是匹配的[A-Za-z]一些特殊字符,其码点发生Za之间撒谎。如果你真的只想匹配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就足够了。