只允许一些字母,禁止特殊字符($%等),除了其他字母(' - )

Hyp*_*zeR 6 php regex unicode utf-8

我需要一个用于PHPRegex来执行以下操作:

我想允许[a-zα-ωá-ź-яա-ֆა-ჰא-ת]和中文,日文(更多utf-8)字母; 我要禁止[^ 98765432100123456789](阿拉伯数字);

这就是我所做的:

function isValidFirstName($first_name) {
    return preg_match("/^(?=[a-z?-?á-??-??-??-??-?]+([a-z?-?á-??-??-??-??-?' -]+)?\z)[a-z?-?á-??-??-??-??-?' -]+$/i", $first_name);
}
Run Code Online (Sandbox Code Playgroud)

它看起来很有效,但是如果我键入超过1种语言的字母,它就不会验证.

示例:АвпаВапапваá-ź约翰 - 没有验证.约翰格格 - 验证,á-źá-ź - 验证.

我想要所有这些.

或者如果有办法,如果用户输入了更多的语言字符串,则回显消息.

Tim*_*ker 2

我无法在这里重现失败案例(\xd0\x90\xd0\xb2\xd0\xbf\xd0\xb0 \xd0\x92\xd0\xb0\xd0\xbf\xd0\xb0\xd0\xbf\xd0\xb2\xd0\xb0 \xc3\xa1-\xc5\xba John验证得很好),但是您可以大大简化正则表达式 - 您不需要先行断言:

\n\n
preg_match(\'/^[a-z\xce\xb1-\xcf\x89\xc3\xa1-\xc5\xba\xd0\xb0-\xd1\x8f\xd5\xa1-\xd6\x86\xe1\x83\x90-\xe1\x83\xb0\xd7\x90-\xd7\xaa][a-z\xce\xb1-\xcf\x89\xc3\xa1-\xc5\xba\xd0\xb0-\xd1\x8f\xd5\xa1-\xd6\x86\xe1\x83\x90-\xe1\x83\xb0\xd7\x90-\xd7\xaa\\\' -]*$/i\', $first_name)\n
Run Code Online (Sandbox Code Playgroud)\n\n

据我从您给出的字符范围来看,您不需要排除数字,因为这些字符类之外的任何内容都将导致正则表达式失败。

\n\n

另一个考虑因素:如果您的目标是允许任何语言/脚本中的任何字母(加上一些标点符号和空格),您可以(如果您使用的是 Unicode 字符串)进一步简化为:

\n\n
preg_match(\'/^\\pL[\\pL\\\' -]*$/iu\', $first_name)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但一般来说,我不会尝试通过正则表达式(或任何其他方式)验证名称:程序员相信名称的谎言

\n