PHP preg_匹配:任何字母,但没有数字(和符号)

PHP preg_匹配:任何字母,但没有数字(和符号),php,regex,Php,Regex,我正在尝试为表单中的字段设置验证规则,以检查输入是否只包含字母 起初,我尝试使一个函数在字符串中没有数字时返回true,因为我使用了preg_match: function my_format($str) { return preg_match('/^([^0-9])$', $str); } 不管我看了多少遍php手册,我似乎都不明白如何创建我想要的模式。我做的有什么问题吗 但我想扩展这个问题:我希望输入的文本包含任何字母,但不包含数字或符号,比如问号、感叹号以及所有你能想象到的东西。但

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

起初,我尝试使一个函数在字符串中没有数字时返回true,因为我使用了preg_match:

function my_format($str)
{
   return preg_match('/^([^0-9])$', $str);
}
不管我看了多少遍php手册,我似乎都不明白如何创建我想要的模式。我做的有什么问题吗

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


我想这不是一件容易的事,在赛前很难或不可能做到。是否有任何库可以满足我的确切需求?

使用
[:alpha::][/code>POSIX表达式

function my_format($str) {
    return preg_match('/[[:alpha:]]+/u', $str);
}
额外的
[]
将POSIX转换为
+
修改的范围,以匹配1个或多个字母字符

如果要包含空格,只需将
\s
添加到范围:

preg_match('/[[:alpha:]\s]+/u', $str);

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

首先,圣诞快乐

您与第一个字符在正确的轨道上,只是缺少一个+来匹配一个或多个非数字字符:

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

如果您使用的是utf-8编码输入,请使用
u修饰符

此选项将匹配仅由字母和任何类型的空白/不可见分隔符组成的字符串:

preg_match('~^[\p{L}\p{Z}]+$~u', $str);
比你想象的要简单

\p{L}匹配来自任何语言的任何类型的字母


输入是utf-8?所以您想检查字符串是否只包含空格和来自任何语言的任何类型的字母,没有其他内容?谢谢。这是一个很好的提醒我使用[:alpha:]而不是[a-zA-Z]。@myusernamewashijackedhere干杯!圣诞快乐!当您使用
[:alpha:]
POSIX命名类您应该使用
u
标志来匹配重音字符,但您没有。@revo您有这方面的源代码吗?
u
是否遵循正则表达式后的
/
?我很懒为您搜索它,但您可以在网上的某个地方进行测试,是的,标志将在最后跟随
/
。例如:乍一看,您忘记了结尾分隔符。
function my_format($str)
{
   return preg_match('/^\p{L}+$/', $str);
}