Обнаружение писем в тексте
Я пытаюсь создать функцию, которая переводит каждое вхождение простого текстового адреса электронной почты в заданную строку в htmlized версию.
Скажем, у меня есть следующий код, где htmlizeEmails
- это функция, которую я ищу:
$str = "Send me an email to [email protected]";
echo htmlizeEmails($str); // Echoes "Send me an email to <a href="mailto:[email protected]">[email protected]</a>."
Если это возможно, я бы хотел, чтобы эта функция использовала функцию filter_var
, чтобы проверить, действительно ли это письмо.
Кто-нибудь знает, как это сделать? Спасибо!
Edit:
Спасибо за ответы, я использовал Rexx Shocker для соответствия потенциальным адресам электронной почты, а затем только, если filter_var
проверяет его, он заменяется.
function htmlizeEmails($text)
preg_match_all('/([a-zA-Z0-9._%+-][email protected][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);
}
}
}
Ответы
Ответ 1
$str = preg_replace('/([a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})/', '<a href="mailto:$1">$1</a>', $str);
где ([a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})
- это регулярное выражение, используемое для обнаружения адреса электронной почты (это общий пример, адреса электронной почты могут быть более сложными, чем это, и не все адреса могут быть охвачены, но поиск идеального регулярного выражения для сообщений электронной почты до вы)
Ответ 2
Всегда соответствует каждой последовательности непространственных символов и тестированию тех, у кого есть filter_var
, но это, вероятно, один из тех случаев, когда лучше использовать регулярные выражения.
echo preg_replace('/(([\w!#$%&\'*+\-\/=?^`{|}~]|\\\\\\\\|\\\\?"|\\\\ )+\.)*([\w!#$%&\'*+\-\/=?^`{|}~]|\\\\\\\\|\\\\?"|\\\\ )[email protected]((\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}\]))
Наслаждайтесь побегом!
Ответ 3
Код ниже должен работать нормально, но с регулярным выражением легче работать.
$str = "Send me an email to [email protected]";
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
about: http://isemail.info/about