Найти адрес электронной почты в строке - ColdFusion 9

Мне было интересно, есть ли в Coldfusion встроенная функция для поиска адресов электронной почты в строке.

Я пытаюсь прочитать вывод запроса ex. "Джон Смит jsmith@example.com" и получите только электронную почту.

Я делал что-то подобное в прошлом, когда подсчитывал пробелы в строке, а после второй строки я стирал все символы слева, которые оставляли адрес электронной почты в покое.

Хотя это может работать в моей ситуации, это небезопасно и почти гарантирует ошибки и неправильное использование данных, которые могут входить в другой формат, такой как "John jsmith@example.com", который в этом случае я уничтожу всю информацию.

2 ответа

Решение

Regex, вероятно, самый простой способ. Существует огромное количество регулярных выражений для электронной почты. Это должно охватывать большинство действительных писем. Это не распространяется на Unicode, например. Обратите внимание, что максимальная длина TLD составляет 63 (см. Этот вопрос и ответ SO).

<cfset string="some garbae@.ca garbage@ca.a real@email.com another@garbage whatever another@email.com oh my!">

<cfset results = reMatchNoCase("[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}", string)>

<cfdump var="#results#">

Вы можете использовать этот UDF от cflib.org от Ray Camden. Это прекрасно работает для меня

<cfscript>
/**
 * Searches a string for email addresses.
 * Based on the idea by Gerardo Rojas and the isEmail UDF by Jeff Guillaume.
     * New TLDs  
     * v3 fix by Jorge Asch
                     * 
 * @param str    String to search. (Required)
 * @return Returns a list. 
 * @author Raymond Camden 
 * @version 3, June 13, 2011 
 */
function getEmails(str) {
    var email = "(['_a-z0-9-]+(\.['_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.    ((aero|coop|info|museum|name|jobs|travel)|([a-z]{2,3})))";
var res = "";
var marker = 1;
var matches = "";

matches = reFindNoCase(email,str,marker,marker);

while(matches.len[1] gt 0) {
    res = listAppend(res,mid(str,matches.pos[1],matches.len[1]));
    marker = matches.pos[1] + matches.len[1];
    matches = reFindNoCase(email,str,marker,marker);        
}
return res;
}
</cfscript>
Другие вопросы по тегам