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