我想检查一个字符串是否只包含这些字符:
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
答案 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}}和^
(字符串的开头和字符串锚点的结尾):
$