Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> е-майлы в тексте? Как найти е-майлы в тексте? 
:(
    Опции темы
bom
Дата 13.7.2005, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Часто юзаю эту функцию из FAQа, предлагаю общими усилиями ее освежить и усовершенствовать, сделать "идеальный" вариант.
Мой новый вариант такой:

Код

Function isEmail(txt As String) As Boolean
Dim Host As String, arrHost() As String, i As Integer, temp() As String
'доменные имена, список можно пополнять без изменения кода
Host = "com|org|net|edu|gov|mil|int|af|al|dz|as|ad|ao|ai|aq|ag|ar|am|aw|" & _
"ac|au|at|az|bs|bh|bd|bb|by|bz|bt|bj|bbe|bm|bo|ba|bw|bv|br|io|bn|bg|bf|bi|" & _
"kh|cm|ca|cv|ky|cf|td|cl|cn|cx|cc|co|km|cd|cg|ck|cr|ci|hr|cu|cy|cz|dk|dj|dm|" & _
"do|tp|ec|eg|sv|gq|er|ee|et|fk|fo|fj|fi|fr|gf|pf|tf|ga|gm|ge|de|gh|gi|gr|gl|gd|" & _
"gp|gu|gt|gg|gn|gw|gy|ht|hm|va|hn|hk|hu|is|in|id|ir|iq|ie|im|il|it|jm|jp|je|jo|" & _
"kz|ke|ki|kp|kr|kw|kg|la|lv|lb|ls|lr|ly|li|lt|lu|mo|mk|mg|mw|my|mv|ml|mt|mh|mq|" & _
"mr|mu|yt|mx|fm|md|mc|mn|ms|ma|mz|mm|na|nr|np|nl|an|nc|nz|ni|ne|ng|nu|nf|mp|no|" & _
"om|pk|pw|pa|pg|py|pe|ph|pn|pl|pt|pr|qa|re|ro|ru|rw|kn|lc|vc|ws|sm|st|sa|sn|sc|" & _
"sl|sg|sk|si|sb|so|za|gs|es|lk|sh|pm|sd|sr|sj|sz|se|ch|sy|tw|tj|tz|th|tg|tk|to|" & _
"tt|tn|tr|tm|tc|tv|ug|ua|ae|gb|us|um|uy|uz|vu|ve|vn|vg|vi|wf|eh|ye|yu|zr|zm|zw|uk|su"
arrHost = Split(Host, "|")
'вырезаем теги, если есть, и все что снаружи их, так как они в проверке не учавствуют
If InStr(1, txt, "mailto:", vbTextCompare) Then txt = Right(txt, Len(txt) - (InStr(txt, ":")))
If InStr(txt, "<") Then txt = Right(txt, Len(txt) - (InStr(txt, "<")))
If InStr(txt, ">") Then txt = Left(txt, InStr(txt, ">") - 1)
If InStr(txt, "?") Then txt = Left(txt, InStr(txt, "?") - 1)
'проверка на только разрешенные символы
    For i = 1 To Len(txt)
        If InStr(1, "qwertyuiopasdfghjklzxcvbnm1234567890@_.<> ", Mid(txt, i, 1), vbTextCompare) = 0 Then isEmail = False: Exit Function
    Next i
'грубая проверка на соответствие маске, min длине имени домена(=2),min длине имени юзера (=1)
If Trim(txt) Like "*?@??*.??*" Then isEmail = True Else isEmail = False: Exit Function
'только 1 "собака"
temp = Split(LCase(txt), "@")
If UBound(temp) > 1 Then isEmail = False: Exit Function
'только 1 точка
temp = Split(LCase(txt), ".")
If UBound(temp) > 1 Then isEmail = False: Exit Function
'проверка на валидность доменного имени
isEmail = False
    For i = 0 To UBound(arrHost)
        If temp(1) = arrHost(i) Then isEmail = True: Exit For
    Next i
End Function

PM MAIL   Вверх
Akina
Дата 13.7.2005, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Функция какая-то кривая, аднака...
1) адрес не обязан предваряться mailto:
2) точек в адресе может быть куча, причем как до, так и после собаки
3) адрес не обязан быть глобальным
4) откуда взялись теги?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bom
Дата 13.7.2005, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Akina
Цитата
кривая, аднака

Согласен, хочу сделать прямую, затем и запостил.
1. mailto: вырезается перед проверкой, но наличие этой команды перед мылом не является ошибкой.
2. Этого не знал, гут, сенкс, исправим...
3. При необходимости можно добавить в список локальные домены.
4. Строка вида "Name<[email protected]>?Subject=Тема&body=Текст". Цель этой функции - правильно распознать в строке, введенной в твоей программе юзером email адрес для дальнейшей передачи строки API функции "ShellExecuteA" библиотеки shell32.dll. Если в строке есть дополнительные данные, такие как имя, тема сообщения, текст сообщения, то в открывшемся дефолтном почтовике они попадут в свои окна.

Код

Function isEmail(txt As String) As Boolean
Dim Host As String, arrHost() As String, i As Integer, temp() As String
'доменные имена, список можно пополнять без изменения кода
Host = "com|org|net|edu|gov|mil|int|af|al|dz|as|ad|ao|ai|aq|ag|ar|am|aw|" & _
"ac|au|at|az|bs|bh|bd|bb|by|bz|bt|bj|bbe|bm|bo|ba|bw|bv|br|io|bn|bg|bf|bi|" & _
"kh|cm|ca|cv|ky|cf|td|cl|cn|cx|cc|co|km|cd|cg|ck|cr|ci|hr|cu|cy|cz|dk|dj|dm|" & _
"do|tp|ec|eg|sv|gq|er|ee|et|fk|fo|fj|fi|fr|gf|pf|tf|ga|gm|ge|de|gh|gi|gr|gl|gd|" & _
"gp|gu|gt|gg|gn|gw|gy|ht|hm|va|hn|hk|hu|is|in|id|ir|iq|ie|im|il|it|jm|jp|je|jo|" & _
"kz|ke|ki|kp|kr|kw|kg|la|lv|lb|ls|lr|ly|li|lt|lu|mo|mk|mg|mw|my|mv|ml|mt|mh|mq|" & _
"mr|mu|yt|mx|fm|md|mc|mn|ms|ma|mz|mm|na|nr|np|nl|an|nc|nz|ni|ne|ng|nu|nf|mp|no|" & _
"om|pk|pw|pa|pg|py|pe|ph|pn|pl|pt|pr|qa|re|ro|ru|rw|kn|lc|vc|ws|sm|st|sa|sn|sc|" & _
"sl|sg|sk|si|sb|so|za|gs|es|lk|sh|pm|sd|sr|sj|sz|se|ch|sy|tw|tj|tz|th|tg|tk|to|" & _
"tt|tn|tr|tm|tc|tv|ug|ua|ae|gb|us|um|uy|uz|vu|ve|vn|vg|vi|wf|eh|ye|yu|zr|zm|zw|uk|su"
arrHost = Split(Host, "|")
'вырезаем теги, если есть, и все что снаружи их, так как они в проверке не учавствуют
If InStr(1, txt, "mailto:", vbTextCompare) Then txt = Right(txt, Len(txt) - (InStr(txt, ":")))
If InStr(txt, "<") Then txt = Right(txt, Len(txt) - (InStr(txt, "<")))
If InStr(txt, ">") Then txt = Left(txt, InStr(txt, ">") - 1)
If InStr(txt, "?") Then txt = Left(txt, InStr(txt, "?") - 1)
'проверка на только разрешенные символы
    For i = 1 To Len(txt)
        If InStr(1, "qwertyuiopasdfghjklzxcvbnm1234567890@_. ", Mid(txt, i, 1), vbTextCompare) = 0 Then isEmail = False: Exit Function
    Next i
'только 1 "собака", min длина имени домена=2, min длина имени юзера=1
temp = Split(LCase(txt), "@")
If UBound(temp) = 1 Then
    If Trim(temp(0)) = "" Or Trim(temp(1)) = "" Or (InStr(txt, ".") - InStr(txt, "@")) <= 2 Then isEmail = False: Exit Function
    Else
    isEmail = False: Exit Function
End If
'проверка на валидность доменного имени
temp(1) = Right(txt, Len(txt) - InStrrev(txt, "."))
isEmail = False
    For i = 0 To UBound(arrHost)
        If temp(1) = arrHost(i) Then isEmail = True: Exit For
    Next i
End Function


Это сообщение отредактировал(а) bom - 13.7.2005, 14:47
PM MAIL   Вверх
Akina
Дата 13.7.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Вот например канва для выделения адресов (причем их может быть в строке несколько).

Код

Option Base 0

Private Const ValidChars As String = "qwertyuiopasdfghjklzxcvbnm1234567890@_."

Sub ParseMailAddresses(StringToParse As String, Addresses() As String)
Dim Tmp() As String
Dim Temp1 As String
Dim Temp2 As String
Dim i As Integer
Tmp = Split(Trim(StringToParse), "@")
If UBound(Tmp) < 1 Then
    ReDim Addresses(0)
    Exit Sub
End If
ReDim Addresses(UBound(Tmp) - 1)
For i = 0 To UBound(Tmp) - 1
    Temp1 = ""
    Temp2 = ""
    Do While Len(Tmp(i)) > 0
        If InStr(ValidChars, Right(Tmp(i), 1)) > 0 Then
            Temp1 = Right(Tmp(i), 1) & Temp1
            Tmp(i) = Left(Tmp(i), Len(Tmp(i)) - 1)
        Else
            Exit Do
        End If
    Loop
    Do While Len(Tmp(i + 1)) > 0
        If InStr(ValidChars, Left(Tmp(i + 1), 1)) > 0 Then
            Temp2 = Temp2 & Left(Tmp(i + 1), 1)
            Tmp(i + 1) = Mid(Tmp(i + 1), 2)
        Else
            Exit Do
        End If
    Loop
    Addresses(i) = Temp1 & "@" & Temp2
Next i
End Sub


Однако все много сложнее... в адресе могут быть почти любые символы, в т.ч. и пробелы (см. напр. RFC 822)... вот, скажем, совершенно валидный адрес: "John Smith"@domain.com


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bom
Дата 13.7.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Akina
Цитата
все много сложнее...
Благодарю Akina за разъяснение, попробую поискать дополнительную инфу по этому вопросу. А что это за RFC 822?
PM MAIL   Вверх
cardinal
Дата 13.7.2005, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



На всякий случай скажу, что в FAQ'e должна быть функция, которая определяет (насколько хорошо не знаю) есть ли в строке почтовый адрес:
VB-VB-002147

Просто для сведения... smile
Добавлено @ 22:23
Только что заметил, что это bom и написал... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Akina
Дата 14.7.2005, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



bom
http://www.faqs.org/rfcs/index.html

Цитата(cardinal @ 13.7.2005, 23:23)
(насколько хорошо не знаю)

Собсно именно об этот моменте речь...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kulibin
Дата 14.8.2005, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 2
Всего: 3



А я для себя софтинку сделал - по проще вроде ваших изысков - пользую долго и щасливо.
Задача у неё по проще. Она выковыривает из списков рассылки адреса, и писает в базульку с ключевым полем mail. А находит она их так: берёт открывающийся тег, проверяет есть ли за ним собака, находит закрывающийся тег - и вырезает текст от позиции откр. тега до закр-ся. Не находит собаку раньше закр.тега - начинает снова этот цикл со след.откр.тега.

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.