只允许某些字母,禁止特殊字符(如$%,等等),但允许其他字符(' -)。

6
我需要一个用于PHP正则表达式,能够实现以下功能:
允许使用[a-zα-ωá-źа-яա-ֆა-ჰא-ת]和中文、日文(更多的UTF-8字符);
禁止使用[^٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹](阿拉伯数字);
这是我做的内容:
function isValidFirstName($first_name) {
    return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?\z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name);
}

看起来它能够工作,但是如果我输入超过一种语言的字母,它就无法验证。

例如:Авпа Вапапва á-ź John - 不能验证。 John Gger - 可以验证,á-ź á-ź - 可以验证。

我希望它能够验证所有这些内容。

或者,如果有办法,当用户输入多种语言字符串时,输出一条消息。


1
什么编程语言?当我们开始谈论Unicode时,这很重要。 - Mike Pennington
请查看 PHP 函数 ctype_alnum - Uday Hiwarale
2个回答

2
您可以使用正则表达式来检查以下方式来过滤掉阿拉伯字符:

您可以通过使用RegEx来检查以下方式来过滤掉阿拉伯字符:

if (preg_match('/(?:[\p{Hebrew}]+)/imu', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

正则表达式解释

<!--
(?i)(?:[\p{IsHebrew}]+)

Options: case insensitive; ^ and $ match at line breaks

Match the remainder of the regex with the options: case insensitive (i) «(?i)»
Match the regular expression below «(?:[\p{IsHebrew}]+)»
   A character in the Unicode block “Hebrew” (U+0590..U+05FF) «[\p{IsHebrew}]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
-->

2

我无法在这里重现故障案例(Авпа Вапапва á-ź John可以很好地验证),但您可以大大简化正则表达式-您不需要那个前瞻断言:

preg_match('/^[a-zα-ωá-źа-яա-ֆა-ჰא-ת][a-zα-ωá-źа-яա-ֆა-ჰא-ת\' -]*$/i', $first_name)

据我所知,根据您提供的字符范围,您不需要排除数字,因为超出这些字符类的任何内容都将导致正则表达式失败。
另一个考虑因素是:如果您的目标是允许来自任何语言/脚本的任何字母(加上一些标点和空格),则可以(如果您使用Unicode字符串)进一步简化此操作:
preg_match('/^\pL[\pL\' -]*$/iu', $first_name)

但是通常情况下,我不会尝试使用正则表达式(或其他任何方式)来验证姓名:程序员对姓名的错误信念


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接