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>."
如果可能,我希望此功能使用该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);
        }
    }
}
$str = preg_replace('/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})/', '<a href="mailto:$1">$1</a>', $str);
([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,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);
我试图尽可能地遵循标准而不使其符合荒谬的要求.任何在他或她的电子邮件地址中发表评论的人都可以安全地忘记,我想.它绝对适用于常见的电子邮件.
编辑:经过漫长而艰难的斗争,这是我的正则表达式,以匹配一切:
((([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}\]))
享受逃避吧!