|
получить адрес эл. почты из строки | ☑ | ||
|---|---|---|---|---|
|
0
Prog_man
гуру
10.03.26
✎
15:58
|
Добрый день,
подскажите как эл.почту получить из строки? сейчас код такой: ПодробностиФункция мПолучитьЭлПочтуОтправителя(Строка) Шаблон = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"; RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.Global = Истина; RegExp.Pattern = Шаблон; Результат = Новый Массив; Matches = RegExp.Execute(Строка); Для Каждого Match Из Matches Цикл Результат.Добавить(Match.Value); КонецЦикла; Возврат Результат; КонецФункции возвращает пустой массив платформа 1С:Предприятие 8.5 (8.5.1.1150) |
|||
|
1
Мультук
гуру
10.03.26
✎
15:22
|
(0)
А как быть с адресами а-ля мультук@миста.рф ? [хе-хе] |
|||
|
2
Prog_man
гуру
10.03.26
✎
15:27
|
(1) с регулярками ранее не работал, может шаблон не верный (то что нагуглил), почта типа мультук@миста.рф, в 1с может и не грузиться
|
|||
|
3
ads55
10.03.26
✎
15:30
|
(2) а почему не ищешь разницу между первый пробел до "@" и первый пробел после "@"?
Так же проще, чем регулярки? |
|||
|
4
Chameleon1980
10.03.26
✎
15:40
|
(3) наверное, "мы не ищем легких путей" :)
|
|||
|
5
Prog_man
гуру
10.03.26
✎
15:44
|
(3) хотел регулярки по юзать )) по сабжу то есть варианты, почему пустой массив?
|
|||
|
6
ads55
10.03.26
✎
15:49
|
(5) "по сабжу то есть варианты" - нет. Больше не мешаю.
"[a-zA-Z0-9.-]+\" - вот это - 9."-"]+"\" - кавычками лишнее выделил. |
|||
|
7
JohnGilbert
10.03.26
✎
15:50
|
https://stepik.org/course/107335/syllabus
Бесплатная часть по синтаксису регулярок проходится за 4-5 часов. Вопросы отпадут быстро. |
|||
|
8
JohnGilbert
10.03.26
✎
15:51
|
А на кой ляд VBScript.RegExp, если есть СтрНайтиПоРегулярномуВыражению?
|
|||
|
9
rozer76
10.03.26
✎
15:55
|
(0) Шаблон = "^[a-zA-Zа-яА-Я0-9._%+-]+@[a-zA-Zа-яА-Я0-9.-]+\.[a-zA-Zа-яА-Я]{2,}$";
|
|||
|
10
rozer76
10.03.26
✎
15:56
|
+ (9) случай в (1) обработает
|
|||
|
11
rozer76
10.03.26
✎
15:57
|
(8) платформа старая
|
|||
|
12
Prog_man
гуру
10.03.26
✎
15:57
|
(8) тестил, тоже не работало, видимо в шаблоне дело
|
|||
|
13
Prog_man
гуру
10.03.26
✎
15:58
|
(11) 1С:Предприятие 8.5 (8.5.1.1150)
|
|||
|
14
Timon1405
10.03.26
✎
15:58
|
(0) у Вас в выражении ^ и $ лишние: это якоря начала и конца строки, то есть подходят только строки которые являются емэйлом, но не содержат где-то емэйл
|
|||
|
15
JohnGilbert
10.03.26
✎
16:01
|
[\w\d.-]+@[\w]+.[\w]+
А дальше уже думать, что у тебя в начале и в конце (^&) или (\b) |
|||
|
16
JohnGilbert
10.03.26
✎
16:03
|
(13) Значит используй СтрНайтиПоРегулярномуВыражению
|
|||
|
17
Prog_man
гуру
10.03.26
✎
16:04
|
(16) видимо так и сделаю, сейчас проверю шаблон
|
|||
|
18
JohnGilbert
10.03.26
✎
16:05
|
(17) https://regex101.com/ здесь можно регулярки отлаживать, помогает. А так респект за неиспользование способа из (3).
|
|||
|
19
Timon1405
10.03.26
✎
16:11
|
(17) RegExp.Ignorecace = истина надо ставить, у вас буквы только большие в шаблоне. в СтрНайтиПоРегулярномуВыражению оно 3м параметром идет, тоже важно истину писать
|
|||
|
20
Prog_man
гуру
10.03.26
✎
16:13
|
благодарю, получилось
|
|||
|
21
JohnGilbert
10.03.26
✎
16:14
|
(19) Очень спорный совет
|
|||
|
22
Prog_man
гуру
10.03.26
✎
16:15
|
(19) ок, вроде и так работает
|
|||
|
23
JohnGilbert
10.03.26
✎
16:16
|
(22) Не надо. \w - уже буквы в верхней и нижней раскладке.
|
|||
|
24
Prog_man
гуру
10.03.26
✎
16:21
|
(23) 👍
|
|||
|
25
probably
10.03.26
✎
16:37
|
{2,} - это означает 2 символа? то есть адреса типа .com не не рассматриваются?
а так же, правильно ли я понимаю, что не рассматриваются адреса формата jet.msk.su? |
|||
|
26
Мимохожий Однако
10.03.26
✎
16:39
|
БСП 3.2.1 Результат = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СписокАдресов)
|
|||
|
27
Timon1405
10.03.26
✎
16:40
|
(25) это 2+ символа, то есть .ru .com .other подойдет, а .z не подойдет
|
|||
|
28
Fish
гуру
10.03.26
✎
16:40
|
(26) Ну вот. Сразу с козырей зашел.
|
|||
|
29
JohnGilbert
10.03.26
✎
16:43
|
(15) Точки экранировать забыл.
(25) [\w\d\.-]+@[\w]+\.[\w\.]+ так найдет адреса с любым количеством точек |
|||
|
30
JohnGilbert
10.03.26
✎
16:46
|
(29) [\w\d\.-]+@[\w\.]+
упрощается до такой формы. \w не содержит пробел. |
|||
|
31
Fish
гуру
10.03.26
✎
16:53
|
(30) Неправильно. кривой адрес типа fgdfg@ya..ya__ находит
|
|||
|
32
JohnGilbert
10.03.26
✎
16:56
|
(31) Согласен) Но, если речь про реальные адреса почты, мы такой не встретим, т.к. там ограничения почтовых сервисов на нейминг. Если искать в сыром тексте адреса имейлов, то будет куча корнер кейсов, которые надо обыгрывать, как ваш.
|
|||
|
33
Fish
гуру
10.03.26
✎
16:59
|
(32) На самом деле вариант (26) решает задачу. В т.ч. и проводит проверку корректности адреса. Зачем, как Гений, изобретать велосипеды?
|
|||
|
34
JohnGilbert
10.03.26
✎
17:00
|
(33) Спорить не буду вовсе. Регулярки - чисто академический интерес. Пару раз меня выручили, там где типовых методов нет.
В ситуации ТС использовать метод из (26) лучший вариант. |
|||
|
35
Fish
гуру
10.03.26
✎
17:02
|
(32) "если речь про реальные адреса почты, мы такой не встретим" - Речь в (0) про получение адреса из строки. Откуда взята эта строка - неизвестно, и реальные там адреса или баба Маня руками с бумажки вбивает, тоже неизвестно. Поэтому, имхо, лучше проверять корректность, чем не проверять.
|
|||
|
36
JohnGilbert
10.03.26
✎
17:04
|
(35) Вы правы. Т.к. уточнений про бабу Маню не было, я исходил из реальных адресов.
Метод из (26) вроде тоже это не решает. // Параметры: // СписокАдресов - Строка - адреса электронной почты, разделитель - запятая, либо точка с запятой: // Получатель1 <Адрес1>, Получатель 2 <Адрес2>... Получатель N <АдресN>. Тут тоже придётся адреса найти и передать. |
|||
|
37
Prog_man
гуру
10.03.26
✎
17:18
|
(35) там типовой текст, из заявки с сайта, т.е. если в форму обратной связи, заполнят не корректный адрес, то почта и не придет. в самой форме тоже проверка на корректность адреса эл. почты. (26) видимо не подойдет, там список адресов нужно передавать.
|
|||
|
38
Мимохожий Однако
10.03.26
✎
17:48
|
(37) Проверял или предполагаешь?
|
|||
|
39
Garykom
гуру
10.03.26
✎
18:55
|
https://habr.com/ru/articles/320572/
Итог
Бессмысленно пытаться выяснить, является ли адрес «действительным». Пользователь с гораздо большей вероятностью введёт неправильный и действительный адрес, чем недействительный. Поэтому лучше потратить своё время буквально на любое другое дело, чем проверять валидность адресов электронной почты. На 100% правильный способ Высылайте пользователям письмо активации. (Здесь жирная точка для эффекта). |
|||
|
40
Garykom
гуру
10.03.26
✎
19:01
|
Поиск email в строке очень простой:
1. Находим @ 2. Находим все слева и справа от @ до первого символа который недопустим в email (разделителя) 3. Все что посередине с @ = email! |
|||
|
41
Garykom
гуру
10.03.26
✎
18:58
|
(40)+ Если надо найти несколько email в строке - использовать рекурсию
После выкусывания первого email из строки, остаток подаем заново на вход |
|||
|
42
Волшебник
10.03.26
✎
19:25
|
(39)(40) Присоединяюсь к мнению. В общем виде задача нерешаемая без Попытка...Исключение.
|
|||
|
43
Кирпич
11.03.26
✎
11:02
|
(0) у тя регулярка проверяет не является ли строка адресом email, а не ищет адреса в тексте. Поставь спереди (\s|^) вместо ^ и сзади (\s|$) вместо $
|
|||
|
44
Кирпич
11.03.26
✎
11:05
|
А еще лучше типа такого (?:\s|^)
|
|||
|
45
Кирпич
11.03.26
✎
11:19
|
А еще лучше вабще убрать ^ и $ :)
|
|||
|
46
DrZombi
гуру
12.03.26
✎
06:23
|
(0) Держите ИИ Гугл накопал :)
Серьёзно, ну не писать же обыденное за вас ;) Пример кода от ИИ Гугла, как искать адрес в строкеbsl &НаКлиентеНаСервереБезКонтекста Функция ИзвлечьEmailИзСтроки(Знач ВходнаяСтрока) // Список символов, которые НЕ могут быть частью адреса Разделители = " ,;()<>[]{}!/|'""\?" + Символы.ПС + Символы.ВК + Символы.Таб; ПозицияСобаки = СтрНайти(ВходнаяСтрока, "@"); Если ПозицияСобаки = 0 Тогда Возврат ""; КонецЕсли; // Идем влево от @ до первого разделителя НачалоАдреса = 1; Для Счетчик = 1 По ПозицияСобаки - 1 Цикл Символ = Сред(ВходнаяСтрока, ПозицияСобаки - Счетчик, 1); Если СтрНайти(Разделители, Символ) > 0 Тогда НачалоАдреса = ПозицияСобаки - Счетчик + 1; Прервать; КонецЕсли; КонецЦикла; // Идем вправо от @ до первого разделителя КонецАдреса = СтрДлина(ВходнаяСтрока); Для Счетчик = 1 По КонецАдреса - ПозицияСобаки Цикл Символ = Сред(ВходнаяСтрока, ПозицияСобаки + Счетчик, 1); Если СтрНайти(Разделители, Символ) > 0 Тогда КонецАдреса = ПозицияСобаки + Счетчик - 1; Прервать; КонецЕсли; КонецЦикла; Результат = Сред(ВходнаяСтрока, НачалоАдреса, КонецАдреса - НачалоАдреса + 1); // Минимальная проверка: точка после @ Если СтрНайти(Результат, ".", , СтрНайти(Результат, "@")) > 0 Тогда Возврат Результат; Иначе Возврат ""; КонецЕсли; КонецФункции // Пример вызова: // Адрес = ИзвлечьEmailИзСтроки("Напишите нам на почту support@company.ru до завтра"); // Сообщить(Адрес); // Выведет: support@company.ru |
|||
|
47
DrZombi
гуру
12.03.26
✎
06:27
|
+(0) Проверка... https://infostart.ru/1c/articles/192489/
|
|||
|
48
ads55
12.03.26
✎
08:25
|
(47) ему и в (3) и в (40) тоже самое предлагали, но ему надо другое :)
|
|||
|
49
Prog_man
гуру
12.03.26
✎
09:49
|
(46) (48) с регуляркой функция получилась в 5 строк
ПодробностиФункция мПолучитьЭлПочтуОтправителя(Текст) РегулярноеВыражение = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"; РезультатыПоиска = СтрНайтиВсеПоРегулярномуВыражению(Текст, РегулярноеВыражение); АдресОтправителя = РезультатыПоиска[0].значение; Возврат АдресОтправителя; КонецФункции у меня функция чуть больше на пару строк, и вариант в (0) тоже рабочий, только нужно шаблон (РегулярноеВыражение) заменить. Задача была простая, получить первый адрес эл.почты, а если бы нужно было получить все адреса из текста, то регулярка возвращает массив всех найденных адресов, что очень удобно. |
|||
|
50
Timon1405
12.03.26
✎
12:35
|
(49) функция, упадёт на ровном месте
мПолучитьЭлПочтуОтправителя("123") = "Индекс находится за границами массива" |
|||
|
51
Prog_man
гуру
12.03.26
✎
16:07
|
(50) С чего ей падать? в функцию передается текст, шаблон текста заранее известен (в моем случае). Для других случаев можно доработать функцию. Как вариант обернуть в Попытка Исключение, в исключении возвращать пустое значение, далее обрабатывать в месте вызова функции. В твоем примере не верный параметр, так можно и другие функции ронять, передавая не верные параметры.
|
|||
|
52
Кирпич
12.03.26
✎
17:05
|
(51) как с чего ей падать. Если в тексте не окажется email, с того и падать
|
|||
|
53
Prog_man
гуру
12.03.26
✎
17:18
|
(52) что мешает доработать функцию, чтобы возвращала пустую строку, если email не найден ? у меня не было задачи сделать универсальную функцию на все случаи. вопрос решен, тему можно закрывать.
|
|||
|
54
uno-group
13.03.26
✎
10:01
|
Искать надо пробелы. Никто не запрещает емейлы вида
ivanov.ivan.ivanovich @ td.brak.sbit.zagran.postavka.com.ru Запаришься шаблон писать. |
|||
|
55
uno-group
13.03.26
✎
10:03
|
поискал для примера 2 точки после сабаки у меня 9% емейлев. с 3 точками 7 штук нашел.
|
|||
|
56
Prog_man
гуру
13.03.26
✎
10:09
|
(54) если про шаблон текста, то в моем случае все просто, это заявка с сайта из формы обратной связи, и да там тоже проверка адреса электронной почты, т.е. если адрес не корректный, то заявка с сайта и не придет на почту. а если придет, то как минимум один адрес электронной почты будет из формы обратной связи. но не все адреса поддерживаются, например кириллицей не пройдет.
|
|||
|
57
Prog_man
гуру
13.03.26
✎
10:22
|
(54) проверил, без пробелов норм. с пробелами не отправляется
ivanov.ivan.ivanovich@td.brak.sbit.zagran.postavka.com.ru |
|||
|
58
uno-group
13.03.26
✎
10:25
|
(57)если норм то все отлично. Пробелы я вставил так как сайт без пробелов у меня @ не отображал.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |