1

我正在为名字创建正则表达式,它可以允许所有特殊字符,但@()&我正在尝试在 PHP 中实现它,我尝试了类似 /^[^0-9\@\(\)\&][a-zA-Z\s]*$/但它没有正确验证的方法。

4

2 回答 2

1

如果您的意图是在字符串中的任何位置允许特殊字符(除了这四个字符),那么您的模式是错误的。

我将分解您的模式以引导您完成它的作用:

  • ^- 匹配必须从一行(或整个字符串)的开头开始。
  • [^0-9\@\(\)\&]- 匹配任何不是数字、一个、括号或 & 符号的单个字符。@顺便说一句,我很确定这里的斜线是多余的。@和字符之前的&字符几乎可以肯定是,因为这些字符在正则表达式中并不特殊。(可能需要and之前的)那些,因为这些字符是子模式分隔符,但我认为它们在这里仍然不需要,因为它们在字符类中。
  • [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
}
于 2013-01-23T15:40:56.843 回答
-2

<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;
}
于 2013-07-25T09:42:09.820 回答