PHP正则表达式匹配字母数字字符串与一些(但不是全部)标点符号

时间:2010-12-17 07:06:03

标签: php regex performance alphanumeric punctuation

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

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

这让我想到了我的问题......有更好,更简单,更有效的方法吗?

3 个答案:

答案 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
}