PHP:检查无效字符(除了a-z,A-Z,0-9,_, - ,。,@)?

时间:2017-06-09 11:26:17

标签: php regex validation

我想检查一个字符串是否只包含这些字符:

A-Z
a-z
0-9
-
@
_
.

目的是检查邮件是否在表单中有效。

我这样做:

if(preg_match('/[a-z0-9\._\-\@]/i', $email) === 0) {
        echo 'not valid';
    }

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'not valid';
} 

但如果有像

这样的特殊字符,则不会返回错误
  

test%@test.fr

2 个答案:

答案 0 :(得分:2)

  

preg_match(' / [a-z0-9 ._- \ @] / i',$ email)

如果找到任何有效字符但您想匹配任何无效字符,则返回true - 所以反转字符类:

preg_match('/[^a-z0-9\._\-\@]/i', $email)

或者,您可以要求包含有效字符:

if (!(preg_match('/^([a-z0-9\._\-\@]+)$/', $email)) {

BTW作为电子邮件地址(更具体地说是ADDR_SPEC验证器)这会耗费大量时间 - 它将传递无效的电子邮件地址并且无法通过有效的电子邮件地址。

谁告诉过你'%'邮箱名称无效?

目前我用这个:

/^[a-z0-9\._%+!$&*=^|~#%'`?{}/\-]+@([a-z0-9\-]+\.){1,}([a-z]{2,20})$/gi

(仍然排除了一些有效的ADDR_SPEC - 但出于特定原因 - 并且在idn方面存在一些问题)

...但建议你只使用filter_var()并抛弃正则表达式。

答案 1 :(得分:1)

正则表达式/[a-z0-9\._\-\@]/i仅检查$email中列出的某些字符。它不会禁止$email中的任何其他字符。

为了限制输入到列出的字符,只需定义它们的序列([a-z0-9\._\-\@]+,注意+量词)并要求它是输入中唯一的序列,用{包围{ {1}}和^(字符串的开头和字符串锚点的结尾):

$