调用函数来验证电子邮件地址的检查约束对我来说效果不佳.
CREATE OR REPLACE FUNCTION f_IsValidEmail(text) returns BOOLEAN AS
'select $1 ~ ''^[^@\s]+@[^@\s]+(\.[^@\s]+)+$'' as result
' LANGUAGE sql;
SELECT f_IsValidEmail('myemail@address.com');
Run Code Online (Sandbox Code Playgroud)
该函数返回false,应为true.我尝试了其他几个正则表达式但是徒劳无功.任何人都可以指出这个功能有什么问题吗?
Eva*_*oll 14
一堆这些答案接近正确的方式.这些是我提交的要点.
我在DBA.StackExchange.com上展示了如何正确执行此操作的两种方法.两者都要检查MX记录,还要使用HTML5规范.这是短暂而甜蜜的.
CREATE EXTENSION citext;
CREATE DOMAIN email AS citext
CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' );
SELECT 'foobar@bar.com'::email;
SELECT CAST('foobar@bar.com' AS email);
Run Code Online (Sandbox Code Playgroud)
有关更多信息,我强烈建议您完整阅读答案.在答案中,我还展示了如何创建一个DOMAIN
结束Email::Valid
,并解释为什么我不再使用该方法.
Sco*_*owe 10
在你付出很多努力之前,你要做的就是确保你没有踢出有效的电子邮件地址.可以或不能在电子邮件地址中存在各种疯狂规则,如果您错误地指出错误的方向,那么具有完全有效电子邮件地址的用户可能会被您的系统拒绝.
确定电子邮件地址是否有效的最佳方法是将其用作需要电子邮件的注册过程的一部分.其他任何事情都是很多工作,收获甚微.
我推荐使用 PL/Perl 和 Email::Address 模块的解决方案。像下面这样:
CREATE OR REPLACE FUNCTION email_valid(email text) RETURNS bool
LANGUAGE plperlu
AS $$
use Email::Address;
my @addresses = Email::Address->parse($_[0]);
return scalar(@addresses) > 0 ? 1 : 0;
$$;
Run Code Online (Sandbox Code Playgroud)
另请参阅http://wiki.postgresql.org/wiki/Email_address_parsing。
归档时间: |
|
查看次数: |
14084 次 |
最近记录: |