【问题标题】:Detecting emails in a text检测文本中的电子邮件
【发布时间】:2012-04-03 13:13:18
【问题描述】:

我正在尝试创建一个函数,将给定字符串中的每一个纯文本电子邮件地址都翻译成它的 htmlized 版本。

假设我有以下代码,其中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 函数来检查电子邮件是否有效。

有人知道怎么做吗?谢谢!

编辑:

感谢您的回答,我使用了 Shocker 的正则表达式来匹配潜在的电子邮件地址,然后,如果 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);
        }
    }
}

【问题讨论】:

标签: php regex email preg-replace preg-match


【解决方案1】:
$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}) 是用于检测电子邮件地址的正则表达式(这是一个一般示例,电子邮件地址可能比这更复杂,并且可能不会涵盖所有地址,但找到完美的电子邮件正则表达式取决于你)

【讨论】:

    【解决方案2】:

    总是匹配每个非空格字符序列并使用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);
    

    我已尽我所能地遵循标准,但又不让它变得荒谬地合规。我认为,任何将 cmets 放入他或她的电子邮件地址的人都可以安全地被遗忘。还有definitely works for common e-mails


    编辑:经过漫长而艰难的斗争,这是我匹配所有内容的正则表达式:

    ((([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}\]))
    

    享受逃离它!

    【讨论】:

    【解决方案3】:

    下面的代码应该可以正常工作,但它更容易使用正则表达式。

    $str = "Send me an email to bob@example.com.";
    
       function htmlizestring($a){
    
            if(substr_count($a,"@") != 1){
                return false;
            }else{
                $b4 = stristr($a,"@",true);
                $b4pos = strripos($b4," ")+1;
                $b4 = trim(substr($b4,$b4pos));
                $after = stristr($a,"@");           
                if(substr_count($after, " ") == 0){
                    $after=rtrim($after," .,");
                }else{
                    $after=trim(stristr($after," ",true));
                }
                $email = $b4.$after;
                echo $email;
                if(filter_var($email, FILTER_VALIDATE_EMAIL)){
                    echo "Send me an email at: <a href='mailto:".$email."'>".$email."</a>";
                }else{
                    return false;
                }
            }   
    
        }
    
        htmlizestring($str);
    

    我碰巧将stristr()与第三个参数TRUE一起使用,它只适用于php 5.3+

    【讨论】:

      【解决方案4】:

      filter_var 很适合验证电子邮件,但 Dominic Sayers 的 is_email 更好,这是我个人的选择。

      源代码:http://code.google.com/p/isemail/source/browse/PHP/trunk/is_email.php

      关于:http://isemail.info/about

      【讨论】:

        猜你喜欢
        • 2021-12-25
        • 2016-08-18
        • 2015-10-25
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多