Обнаружение писем в тексте

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

Кто-нибудь знает как это сделать? Благодаря!

Редактировать:

Спасибо за ответы, я использовал регулярное выражение 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); } } } . 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); 

Я старался следовать стандарту как можно лучше, не делая его смехотворным. Думаю, кто-нибудь, кто комментирует его или ее адрес электронной почты, может быть просто забыт. И это определенно работает для обычных электронных писем .


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

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

Наслаждайтесь побегом!

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

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

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

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

о: http://isemail.info/about