正则表达式验证名字不包括@()&

时间:2013-01-23 15:00:48

标签: php regex

我希望创建Regex的第一个名称,它可以允许除@()&之外的所有特殊字符,我试图在PHP中实现它我试过像 /^[^0-9\@\(\)\&][a-zA-Z\s]*$/但未正确验证。

2 个答案:

答案 0 :(得分:1)

如果你打算在字符串中允许特殊字符(除了那四个) where ,那么你的模式是错误的。

我会打破你的模式,引导你完成它的工作:

  • ^ - 匹配必须从一行(或整个字符串)的开头开始。
  • [^0-9\@\(\)\&] - 匹配任何单个字符,这不是数字,@,括号或符号。顺便说一句,我很确定这里的斜线是多余的。 @&字符之前的字符几乎肯定是,因为这些字符在正则表达式中并不是特殊的。可能需要()之前的那些,因为这些字符是子模式分隔符,但我认为它们仍然不需要,因为它们在字符类中。
  • [a-zA-Z\s]* - 匹配A和Z之间的任何小写或大写字符,或任何空格字符,如空格(这是\s所做的)。 *表示您可以匹配与这些字符一样多的这些字符,如果在这个位置中不存在任何字符,则不能匹配。
  • $ - 匹配必须在行尾(或整个字符串)结束。

简而言之,您只是从字符串的第一个字符中排除这四个特殊字符,但您将所有特殊字符排除为任意字符第一个之后的字符。

如果你想在字符串的任何位置允许任何字符(除了那四个字符),那么你应该使用它作为你的模式:

/^[^0-9@&()]*$/

尽管如此,我认为你可能会使事情过于复杂化。这是一种意见问题,但我尝试只在没有其他办法做某事时才使用正则表达式,因为它们有点难以阅读(这个问题就是一个很好的例子)。

我建议您只使用str_replace删除您禁用的四个字符,并根据原始输入检查结果字符串:

if($input === str_replace(array('@', '&', '(', ')'), '', $input) {
  // process valid input
} else {
  // handle invalid input
}

str_replace调用将使用您的原始字符串并替换搜索数组array('@', '&', '(', ')')中的任何值,并将其删除(从技术上讲,“替换”没有任何内容)。如果之后两个字符串匹配,则不存在任何无效字符,并且您的输入有效。

由于您将括号用作数组中的项目,因此将元素分隔到各自的行上可能更具可读性:

$chars_to_remove = array(
                     '@',
                     '&',
                     '(',
                     ')'
                   );
if ($input === str_replace($chars_to_replace, '', $input)) {
  // process valid input
} else {
  // handle invalid input
}

答案 1 :(得分:-2)

FirstName <input type=text name="fname" onblur="first(this)" />

function first(ev) {
    var val = ev.value;
    if(isNaN(val)) {
        for(var i = 0; i < 10; i++) {
            if(val.indexOf(i) != -1) {
                alert("Enter Only chars");
                return false;
            }
        }
    }
    else {
        alert("Enter Only chars");
    }
    return true;
}