我想在PHP中创建一个reg表达式,允许所有字母表中的所有字母,包括西里尔文,希腊文中文等,还允许使用数字,点和下划线。前三个字符必须是字母(所有字母)。
这将用于验证用户名,因此没有空格。
$regex = \p{L}\;
答案 0 :(得分:2)
你可以提出:
$username = 'äöäölöäßµ';
$regex = '~^\p{L}{3}[\p{L}\w]*[\p{L}\d]$~u';
if (preg_match($regex, $username)) {
// it matches
}
另请参阅regex101.com上的演示 这允许前三个字符的字母(任何字母表)和字母,数字和下划线直到结尾。最后一个字符只允许一个或多个字母。
答案 1 :(得分:0)
我有同样的问题要解决,我似乎终于在stackoverflow赢得了金牌。但是Jan的解决方案并不完全正确,因为国家/地区特定的字符必须始终以Unicode(UTF-8或更高版本)编码。但是,对于UTF-8或更高版本,没有PHP的preg函数绝对正确。然后必须使用mb_ereg函数。但是,尽管必须省略定界符~
和修饰符u
(POSIX语法),但正则表达式也可以与mb_ereg_match完美配合。
我还注意到了一个小缺陷,尽管在这一点上必须说我很挑剔。 :-) “卷曲字体”(阿拉伯语,日语,中文等)自然也可以识别regExp不会拦截的数字。例如,将允许使用用户名“二つつのキラビアンカ”,但不允许以数字开头。但是“二つ”(日语)代表生活在欧洲的人们,他们的数字比较普通,为2(整个拉丁字符为:“ 2Kira-Bianca”)。尽管我不得不承认我无法使用这些“卷曲字体”中的任何一种,并且不知道这些字符是否真的等同于我们的数字2或书面的两个。
最后,简要介绍一下我使用的“ curl-fonts”表达式。这绝不是贬义,但我没有别的主意,我可以将其用作这些著作的总称。相反,我们的拉丁字母对人来说也只是卷发,而这些人并不掌握这些字母。