6

我需要一个用于PHP的正则表达式来执行以下操作:

我想允许[a-zα-ωá-źа-яա-ֆა-ჰא-ת]和中文、日文(更多 utf-8)字母;我想禁止[^٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹](阿拉伯数字);

这就是我所做的:

function isValidFirstName($first_name) {
    return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?\z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name);
}

看起来它可以工作,但如果我输入超过 1 种语言的字母,它就不会生效。

示例:Авпа Вапапва á-ź John - 不验证。John Gger - 验证,á-ź á-ź - 验证。

我想要这一切。

或者,如果有办法,如果用户输入了更多语言字符串,则可以回显一条消息。

4

2 回答 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) «+»
-->
于 2012-05-08T10:56:59.913 回答
2

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

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

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

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

preg_match('/^\pL[\pL\' -]*$/iu', $first_name)

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

于 2012-05-08T11:04:52.250 回答