0

我在 PHP 中编写了一个正则表达式,以允许包含除&@之外的任何标点符号的字母数字字符串。本质上,我需要在标准美式键盘上允许除这两个字符之外的任何内容。我花了一段时间才想出以下正则表达式,这似乎正在做我需要的事情:

if (ereg("[^]A-Za-z0-9\[!\"#$%'()*+,./:;<=>?^_`{|}~\-]", $test_string)) {
  // error message goes here
}

这让我想到了我的问题……有没有更好、更简单或更有效的方法?

4

3 回答 3

3

看看字符范围:

@[!-%'-?A-~]+@

这将排除字符& (\0x26)@ (0x40)。查看ASCII 表,您可以看到它是如何工作的:感叹号是 ASCII 集中的第一个字符,而不是空格。然后它将匹配所有内容,包括%字符,该字符紧接在&符号之前。然后是下一个范围,直到@位于 和 之间?的字符A。之后,我们将所有内容匹配到标准 ASCII 字符集的末尾,即~.

更新

为了使内容更具可读性,您还可以考虑分两步执行此操作:首先,过滤默认 ASCII 范围之外的任何内容。

@[!-~]+@

在第二步中,过滤您不需要的字符,或者简单地str_pos对字符进行操作。

最后,您可以将它与您开始查看它是否包含任何不需要的字符进行比较。

相反,您也可以在第二步中使用这样的正则表达式。 /[^@&]+/

@这些步骤是可互换的,并且在第一步上或&作为第一步执行 str_pos来识别坏字符可能会更好地提高性能。

于 2010-12-17T07:35:40.240 回答
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
于 2010-12-17T07:10:42.533 回答
0

我认为与其测试所有字母数字字符,不如简单地检查 @ 和 & 并使用 not?

$reg = '/@|&/';
if(!preg_match($reg, "YOUR STRING CAN GO HERE")){
// your code goes here
}
于 2010-12-17T07:33:35.750 回答