Apex应用文本项(逗号分隔多邮箱)合法性验证实现咨询
解决Apex中逗号分隔邮箱地址的验证问题
首先得指出你原来代码里的几个关键问题:
- 错误用了
apex_item.text(1)获取页面项值:这个API是用来在报表里生成文本输入控件的,要拿当前页面的文本项值,得用:PXX_YOUR_ITEM_NAME(把XX换成你的页面编号,YOUR_ITEM_NAME换成你的文本项名称)。 - 逻辑判断完全反了:
if not l_requestors_name not like '%@%'是双重否定,而且这种方式只能检查有没有@,根本做不了合法邮箱格式的验证。 - 没处理多邮箱场景:你的代码只检查了整个字符串,没有拆分每个邮箱单独验证。
下面给你两种实用的实现方式,按需选就行:
方式一:PL/SQL函数验证(推荐,灵活可控)
假设你的文本项叫P1_EMAILS,页面编号是1,按以下步骤创建验证:
- 进入页面编辑界面,找到对应文本项,切换到「验证」标签,新建验证,类型选「PL/SQL函数返回错误文本」。
- 在PL/SQL代码区输入:
DECLARE l_email_list apex_t_varchar2; l_email varchar2(255); l_error_msg varchar2(4000); -- 标准邮箱格式正则表达式 l_email_regex varchar2(200) := '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'; BEGIN -- 拆分逗号分隔的邮箱列表,同时去除前后空格 l_email_list := apex_string.split(trim(:P1_EMAILS), ','); -- 逐个验证每个邮箱 FOR i IN 1..l_email_list.count LOOP l_email := trim(l_email_list(i)); -- 跳过连续逗号产生的空项 IF l_email IS NULL THEN CONTINUE; END IF; -- 用正则检查邮箱格式 IF NOT REGEXP_LIKE(l_email, l_email_regex) THEN l_error_msg := l_error_msg || '第' || i || '个邮箱 "' || l_email || '" 格式不合法' || CHR(10); END IF; END LOOP; -- 有错误就返回提示,无错误返回NULL表示验证通过 IF l_error_msg IS NOT NULL THEN RETURN l_error_msg; ELSE RETURN NULL; END IF; END;
- 保存后测试:比如输入
test@example.com, invalid-email, another@test.co,会明确提示第二个邮箱格式不对。
方式二:正则表达式验证(更简洁)
如果不想写PL/SQL,也可以直接用正则验证:
- 新建验证,类型选「正则表达式」,验证规则选「不匹配时显示错误」。
- 正则表达式输入框填:
^(\s*[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\s*)(,\s*[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\s*)*$
- 错误消息填:「请输入合法的逗号分隔邮箱地址」
这个正则会匹配单个合法邮箱,也支持多个用逗号分隔的邮箱,还允许邮箱前后带空格。
补充提示
- 正则表达式可以根据你的需求调整,比如允许某些特殊字符,或者限制域名后缀长度。
- 如果你的文本项允许空值,记得在验证里勾选「当项为空时跳过验证」,避免空值触发错误。
内容的提问来源于stack exchange,提问作者Abinnaya
相关产品推荐
相关产品推荐

