【问题标题】:PHP: check for invalid characters (all but a-z, A-Z, 0-9, _, -, ., @)?PHP:检查无效字符(除了 a-z、A-Z、0-9、_、-、.、@)?
【发布时间】:2017-06-09 11:26:17
【问题描述】:

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

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

【问题讨论】:

  • 为什么要使用正则表达式除了 FILTER_VALIDATE_EMAIL...?您正在创建另一个 arbitrary subset of email addresses you're allowing people to use!
  • /[a-z0-9\._\-\@]/i 如果一个字符匹配成功。
  • filter_var() 带有一个电子邮件标志,无论是清理还是验证,这是您唯一需要的
  • 请注意,Gmail 用户可以在他们的电子邮件中使用+ 来过滤收到的邮件。您的正则表达式没有考虑到这一点。
  • 您的电子邮件地址示例是有效的,因此filter_var 不会将其视为无效。对于preg_match,请查看:eval.in/814651

标签: php regex validation


【解决方案1】:

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

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

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

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

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

顺便说一句,作为一个电子邮件地址(更具体地说是一个 ADDR_SPEC 验证器)这很糟糕——它会传递无效的电子邮件地址,而使有效的电子邮件地址失败。

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

目前我用这个:

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

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

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

【讨论】:

  • “发明”还是“反转”?
  • 是我的客户要求这些规则,所以我试图实施它们。但是感谢您的解释,我意识到这是一个坏主意。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2015-02-23
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多