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

时间:2012-05-08 10:36:43

标签: php regex unicode utf-8

PHP 需要正则表达式才能执行以下操作:

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

这就是我所做的:

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

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

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

我想要所有这些。

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

2 个答案:

答案 0 :(得分:2)

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

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

RegEx解释

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

答案 1 :(得分:2)

我无法重现这里的失败案例(Авпа Вапапва á-ź John验证就好了),但你可以大量简化正则表达式 - 你不需要那个先行断言:

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

就我所知的字符范围而言,您不需要排除数字,因为这些字符类之外的任何内容都会导致正则表达式失败。

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

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

但一般情况下,我不会尝试通过正则表达式(或任何其他方式)验证名称:Falsehoods programmers believe about names