gpt4 book ai didi

javascript - 正则表达式匹配除 anchor 标记一之外的所有电子邮件

转载 作者:行者123 更新时间:2023-11-29 23:17:31 25 4
gpt4 key购买 nike

我需要从包含 html 或不包含 html 的内容中找到所有电子邮件地址,并需要替换为链接。

我有以下用于电子邮件地址查找的正则表达式,它运行良好。

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

这是处理示例数据的演示链接: https://regexr.com/3v12e

这是 anchor 标记正则表达式 (?:(<a[^>]*>([^<]+)<\/a>))

那么如何找到除 anchor 标记一之外的所有电子邮件地址:

enter image description here

最佳答案

您可以使用类似于 trash bin trick 的东西.

您基本上搜索 3 个案例:“a”标签、电子邮件和“其余”。您为这 3 个案例中的任何一个分配一个捕获组。然后根据这些组是否为空,您可以做不同的事情。因此,这个结构:(A_TAG)|(EMAIL)|([\s\S])(其中 [\s\S] 表示任何字符,包括换行符)

应该说顺序很重要:你希望第一组是'a'标签,以便快速丢弃它。 'any character' ([\s\S]) 必须是最后一个选项,因为如果它是第一个,它将匹配任何内容并且不会给其他选项匹配的机会任何文本。

const regex = /(?:(<a[^>]*>(?:[^<]+)<\/a>))|((?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]))|([\s\S])/gm;
const str = `example@gmail.com
example@gmail.com
For more information example@gmail.com about I Can Read,
example@gmail.com please refer to <a href="mailto:do-not@example.com">do-not@example.com</a>our website example@gmail.com
example@gmail.com
example@gmail.com
example@gmail.com
example@gmail.com

sdfsdf example@gmail.com
example@gmail.com sdfsdfsdf`;
let m;

let acc = '';
while ((m = regex.exec(str)) !== null) {
if (typeof(m[1])!='undefined') {
//First group is defined: it will have a <a> tag
//So we just add it to the acumulator as-is.
acc += m[1];
}
else if (typeof(m[2])!='undefined') {
//Second group is defined: it will have an email
//we change it
acc += '<a href="mailto:' + m[2] + '">' + m[2] + '</a>';
}
else {
//Any other character. We just add to the accumulator
acc += m[3];
}
}
console.log(acc);

此外,here你可以找到一个演示,只是为了直观地看到不同的捕获组。当然,对于替换,您需要上述额外的逻辑。

关于javascript - 正则表达式匹配除 anchor 标记一之外的所有电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52197242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com