我在PHP中编写了一个正则表达式,允许使用除& 或 @ 之外的任何标点符号的字母数字字符串。基本上,除了这两个字符外,我需要在标准的美式键盘上允许任何内容。我花了一段时间来提出以下正则表达式,这似乎正在做我需要的:
if (ereg("[^]A-Za-z0-9\[!\"#$%'()*+,./:;<=>?^_`{|}~\-]", $test_string)) {
// error message goes here
}
这让我想到了我的问题......有更好,更简单,更有效的方法吗?
答案 0 :(得分:3)
看看角色范围:
@[!-%'-?A-~]+@
这将排除字符& (\0x26)
和@ (0x40)
。
查看ASCII Table,您可以看到它是如何工作的:
感叹号是ASCII集中的第一个字符,不是空格。然后它会匹配所有内容,包括紧跟在&符号之前的%
字符。然后是下一个范围,直到位于@
和?
之间的A
字符。之后,我们将所有内容匹配到标准ASCII字符集的末尾,即~
。
为了使事情更具可读性,您可能还会考虑分两步执行此操作: 首先,过滤除默认ASCII范围之外的任何内容。
@[!-~]+@
在第二步中,过滤不受欢迎的字符,或只是对字符进行str_pos
。
最后,您可以将它与您开始查看它是否包含任何不需要的字符进行比较。
相反,你也可以在第二步使用这样的正则表达式。
/[^@&]+/
这些步骤是可以互换的,并且在@
或&
上执行str_pos作为第一步,识别不良角色,可能会更好地表现。
答案 1 :(得分:1)
这个怎么样:
[^&@]
preg_match
$str = 'a';
var_dump(preg_match('~^[^&@]+$~', $str)); // true
$str = '&';
var_dump(preg_match('~^[^&@]+$~', $str)); // false
$str = '!';
var_dump(preg_match('~^[^&@]+$~', $str)); // true
答案 2 :(得分:0)
我认为不是测试所有字母数字字符,而是只需检查@和&amp ;;并使用不?
$reg = '/@|&/';
if(!preg_match($reg, "YOUR STRING CAN GO HERE")){
// your code goes here
}