修改JavaScript正则以支持西里尔文与拉丁文的URL和邮箱验证
支持西里尔文的URL/邮箱匹配正则修改方案
原正则的核心问题在于:
- JavaScript默认的
\w仅匹配拉丁字母、数字和下划线,不包含西里尔字符 \b单词边界对非拉丁字符的识别逻辑不适用,会导致匹配失效- 最后一部分的
[A-Za-z]限制只能匹配拉丁后缀,无法识别.рф这类西里尔域名后缀
以下是修改后的完整代码:
let final = text; const divElement = document.createElement('div'); // 修改后的正则,支持Unicode字符(含西里尔文) const linkRegExp = /(?<!\S)((https?:\/\/)?[\p{L}\p{N}_-]+(?:[:.][\p{L}\p{N}_-]+)+)|([\p{L}\p{N}_-]+@[\p{L}\p{N}_-]+(?:\.[\p{L}\p{N}_-]+)+)(?!\S)/gui; function replacer(url) { if (url.match(/[\p{L}\p{N}_-]+@[\p{L}\p{N}_-]+(?:\.[\p{L}\p{N}_-]+)+/ui)) { const email = document.createElement('a'); email.innerHTML = url; email.href = `mailto:${url}`; email.setAttribute('class', 'email'); return email.outerHTML; } const link = document.createElement('span'); link.innerHTML = url; link.setAttribute('class', 'link'); link.setAttribute('style', 'color: blue; cursor: pointer'); return link.outerHTML; } final = final.replace(linkRegExp, replacer);
关键修改说明:
- 使用
\p{L}\p{N}Unicode属性转义:\p{L}匹配任意语言的字母(含西里尔文),\p{N}匹配任意数字,替代原有的\w,确保支持多语言字符 - 替换
\b为(?<!\S)和(?!\S):通过负向环视匹配前后为空白或字符串边界,解决非拉丁字符的单词边界识别问题 - 移除原正则中过于严格的
{1,32}长度限制:避免截断合法的长域名(如стопкоронавирус.рф) - 修改邮箱匹配正则为Unicode兼容版本,确保识别含西里尔文的邮箱地址
- 添加
u标志:启用正则的Unicode模式,让\p{}属性转义生效
测试支持的示例:
- 西里尔域名:
яндекс.рф、стопкоронавирус.рф - 带协议的西里尔链接:
https://яндекс.рф/news - 西里尔邮箱:
пользователь@стопкоронавирус.рф - 混合字符链接:
site-рус.ru、https://mix-domain.рф
内容的提问来源于stack exchange,提问作者Ваш ГОСТ
相关产品推荐
相关产品推荐

