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


Allow only some letters, ban special characters ($% etc.) except others (' -)

我需要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 - validates, á-ź á-ź - validates.

我想所有这些。

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

我无法在此处重现失败情况(Авпа Вапапва á-ź John验证得很好),但您可以大大简化正则表达式 - 您不需要该前瞻性断言:

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

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

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

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

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

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

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) «+»
-->