Обнаружение электронных писем в тексте - PullRequest
15 голосов
/ 19 марта 2012

Я пытаюсь создать функцию, которая переводит каждое вхождение обычного текстового адреса электронной почты в заданной строке в 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);
        }
    }
}

Ответы [ 4 ]

8 голосов
/ 19 марта 2012
$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}) - это регулярное выражение, используемое для определения адреса электронной почты (это общий пример, адреса электронной почты могут быть более сложными, чем это, и не все адреса могут быть охвачены, но поиск идеального регулярного выражения для электронных писем может занять до вы)

6 голосов
/ 19 марта 2012

Всегда есть соответствие каждой последовательности непробельных символов и проверка их с 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}\]))

Наслаждайся от этого!

0 голосов
/ 19 марта 2012

filter_var приятно проверить электронную почту, но Доминик Сэйерс 'is_email еще лучше, и мой личный выбор.

исходный код: http://code.google.com/p/isemail/source/browse/PHP/trunk/is_email.php

о: http://isemail.info/about

0 голосов
/ 19 марта 2012

Приведенный ниже код должен работать нормально, но с регулярным выражением легче работать.

$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 +

...