我正在尝试为表单中的字段设置验证规则,以检查输入是否只包含字母。
首先,如果字符串中没有数字,我尝试创建一个返回true的函数,因为我使用了preg_match:
function my_format($str)
{
return preg_match('/^([^0-9])$', $str);
}
我看了多少次php手册并不重要,似乎我不会理解如何创建我想要的模式。我做的是什么问题?
但我想扩展一个问题:我希望输入文本包含任何字母,但不包含数字或符号,如问号,感叹号以及所有您能想象的内容。但是我想要的字母不仅仅是a-z,我想要各种口音的字母,如西班牙语,葡萄牙语,瑞典语,波兰语,塞尔维亚语,岛屿语......
我想这不是一件容易的事,而且很难或不可能用preg_match做。有没有图书馆可以满足我的确切需求?
答案 0 :(得分:5)
如果您使用的是utf-8编码输入,请转到unicode regex。使用u modifier
。
这个匹配的字符串只包含字母和任何类型的空格/不可见分隔符:
preg_match('~^[\p{L}\p{Z}]+$~u', $str);
答案 1 :(得分:2)
首先,圣诞快乐。
你在第一个跟踪的正确轨道上,只缺少一个+来匹配一个或多个非数字字符:
preg_match('/^([^0-9]+)$/', $str);
如您所见,0-9是一个范围,从0到9。这适用于其他一些情况,如a-z或A-Z,' - '是特殊的,它表示它是一个范围。对于0-9,您可以使用\ d之类的简写:
preg_match('/^([^\d]+)$/', $str);
对于符号,如果您的列表是标点符号。 ,“'?!;:#$%&()* + - /<> = @ [] \ ^ _ {} |〜,有一个简写。
preg_match('/^([^[:punct:]]+)$/', $str);
结合你得到:
preg_match('/^([^[:punct:]\d]+)$/', $str);
答案 2 :(得分:2)
function my_format($str)
{
return preg_match('/^\p{L}+$/', $str);
}
比你想象的简单!
\ p {L}匹配来自任何语言的任何类型的信件
答案 3 :(得分:1)
使用[:alpha:]
POSIX表达式。
function my_format($str) {
return preg_match('/[[:alpha:]]+/u', $str);
}
额外[]
将POSIX转换为+
修改的范围,以匹配1个或多个字母字符。 As you can see, the :alpha:
POSIX matches accented characters as well
如果您想要包含空格,只需将\s
添加到范围:
preg_match('/[[:alpha:]\s]+/u', $str);
编辑:对不起,当我第二次看到它时,我误解了你的问题并认为你想要标点符号。我把它拿回来了。