PHP preg_match:任何字母但没有数字(和符号)

时间:2013-12-25 21:28:15

标签: php regex

我正在尝试为表单中的字段设置验证规则,以检查输入是否只包含字母。

首先,如果字符串中没有数字,我尝试创建一个返回true的函数,因为我使用了preg_match:

function my_format($str)
{
   return preg_match('/^([^0-9])$', $str);
}

我看了多少次php手册并不重要,似乎我不会理解如何创建我想要的模式。我做的是什么问题?

但我想扩展一个问题:我希望输入文本包含任何字母,但不包含数字或符号,如问号,感叹号以及所有您能想象的内容。但是我想要的字母不仅仅是a-z,我想要各种口音的字母,如西班牙语,葡萄牙语,瑞典语,波兰语,塞尔维亚语,岛屿语......

我想这不是一件容易的事,而且很难或不可能用preg_match做。有没有图书馆可以满足我的确切需求?

4 个答案:

答案 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);

编辑:对不起,当我第二次看到它时,我误解了你的问题并认为你想要标点符号。我把它拿回来了。