检测文本中的电子邮件

fed*_*o-t 15 php regex email preg-replace preg-match

我正在尝试创建一个函数,将给定字符串中每个出现的纯文本电子邮件地址转换为它的html化版本.

假设我有以下代码,htmlizeEmails我正在寻找的功能在哪里:

$str = "Send me an email to bob@example.com.";
echo htmlizeEmails($str); // Echoes "Send me an email to <a href="mailto:bob@example.com">bob@example.com</a>."
Run Code Online (Sandbox Code Playgroud)

如果可能,我希望此功能使用该filter_var功能来检查电子邮件是否有效.

有谁知道如何做到这一点?谢谢!

编辑:

感谢您的答案,我用令人震惊的正则表达式匹配潜在的电子邮件地址,然后,只有filter_var验证它,它就会被取代.

function htmlizeEmails($text)
    preg_match_all('/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})/', $text, $potentialEmails, PREG_SET_ORDER);

    $potentialEmailsCount = count($potentialEmails);
    for ($i = 0; $i < $potentialEmailsCount; $i++) {
        if (filter_var($potentialEmails[$i][0], FILTER_VALIDATE_EMAIL)) {
            $text = str_replace($potentialEmails[$i][0], '<a href="mailto:' . $potentialEmails[$i][0] .'">' . $potentialEmails[$i][0] .'</a>', $text);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sho*_*ker 8

$str = preg_replace('/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})/', '<a href="mailto:$1">$1</a>', $str);
Run Code Online (Sandbox Code Playgroud)

([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})用于检测电子邮件地址的正则表达式在哪里(这是一个通用示例,电子邮件地址可能比这更复杂,并非所有地址都可以覆盖,但找到完美的电子邮件正则表达式取决于您)


Ry-*_*Ry- 6

总是匹配每个非空格字符序列并测试它们filter_var,但这可能是使用正则表达式更好的情况之一.

echo preg_replace('/(([\w!#$%&\'*+\-\/=?^`{|}~]|\\\\\\\\|\\\\?"|\\\\ )+\.)*([\w!#$%&\'*+\-\/=?^`{|}~]|\\\\\\\\|\\\\?"|\\\\ )+@((\w+[\.-])*[a-zA-Z]{2,}|\[(\d{1,3}\.){3}\d{1,3}\])/', '<a href="mailto:$0">$0</a>', $str);
Run Code Online (Sandbox Code Playgroud)

我试图尽可能地遵循标准而不使其符合荒谬的要求.任何在他或她的电子邮件地址中发表评论的人都可以安全地忘记,我想.它绝对适用于常见的电子邮件.


编辑:经过漫长而艰难的斗争,这是我的正则表达式,以匹配一切:

((([a-zA-Z0-9!\#\$%&'*+\-\/=?^_`{|}~]+|"([a-zA-Z0-9!\#\$%&'*+\-\/=?^_`{|}~(),:;<>@\[\]]|\\[ \\"])+")\.)*([a-zA-Z0-9!\#\$%&'*+\-\/=?^_`{|}~]+|"([a-zA-Z0-9!\#\$%&'*+\-\/=?^_`{|}~(),:;<>@\[\]]|\\[ \\"])+"))@((([a-zA-Z0-9]([a-zA-Z0-9]*(\-[a-zA-Z0-9]*)*)?\.)*[a-zA-Z]{2,}|\[((0?\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(0?\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\]|\[[Ii][Pp][vV]6(:[0-9a-fA-F]{0,4}){6}\]))
Run Code Online (Sandbox Code Playgroud)

享受逃避吧!