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