← Назад к вопросам

Создать функцию для валидации email

1.7 Middle🔥 171 комментариев
#JavaScript Core

Условие

Напишите функцию isValidEmail(email), которая проверяет корректность email-адреса.

Требования

  1. Email должен содержать символ @
  2. Перед @ должна быть хотя бы одна буква или цифра
  3. После @ должен быть домен с хотя бы одной точкой
  4. После последней точки должно быть минимум 2 символа

Примеры

isValidEmail("test@example.com");     // true
isValidEmail("user.name@domain.org"); // true
isValidEmail("invalid");              // false
isValidEmail("@nodomain.com");        // false
isValidEmail("test@.com");            // false
isValidEmail("test@domain");          // false

Бонус

Реализуйте валидацию с помощью регулярного выражения и без него.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Задача на валидацию email — показывает понимание регулярных выражений и строк.

Решение 1: С регулярным выражением

function isValidEmail(email) {
  const regex = /^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return regex.test(email);
}

// Использование
console.log(isValidEmail("test@example.com"));      // true
console.log(isValidEmail("user.name@domain.org"));  // true
console.log(isValidEmail("invalid"));               // false
console.log(isValidEmail("@nodomain.com"));         // false
console.log(isValidEmail("test@.com"));             // false
console.log(isValidEmail("test@domain"));           // false

Объяснение regex:

  • ^ — начало строки
  • [a-zA-Z0-9._+-]+ — одна или больше букв, цифр, точка, подчёркивание, плюс, дефис
  • @ — обязательный символ @
  • [a-zA-Z0-9.-]+ — домен с буквами, цифрами, точками, дефисом
  • \. — обязательная точка
  • [a-zA-Z]{2,} — минимум 2 буквы после точки (TLD)
  • $ — конец строки

Решение 2: Без регулярных выражений (string методы)

function isValidEmail(email) {
  // Проверка @ символа
  const atIndex = email.lastIndexOf('@');
  if (atIndex === -1 || atIndex === 0) {
    return false;
  }

  const localPart = email.substring(0, atIndex);
  const domain = email.substring(atIndex + 1);

  // Проверка local part
  if (localPart.length === 0) {
    return false;
  }

  // Проверка domain
  const dotIndex = domain.lastIndexOf('.');
  if (dotIndex === -1 || dotIndex === 0 || dotIndex === domain.length - 1) {
    return false;
  }

  const tld = domain.substring(dotIndex + 1);
  if (tld.length < 2) {
    return false;
  }

  return true;
}

Решение 3: Более строгая валидация regex

// RFC 5322 simplified (но более реалистично)
function isValidEmailStrict(email) {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  
  if (!regex.test(email)) return false;

  const [local, domain] = email.split('@');
  
  // Локальная часть
  if (local.length > 64) return false;
  if (local.startsWith('.') || local.endsWith('.')) return false;
  if (local.includes('..')) return false;
  
  // Доменная часть
  const parts = domain.split('.');
  if (parts.length < 2) return false;
  
  for (const part of parts) {
    if (part.length === 0 || part.length > 63) return false;
    if (!/^[a-zA-Z0-9-]+$/.test(part)) return false;
    if (part.startsWith('-') || part.endsWith('-')) return false;
  }
  
  // TLD должен быть буквами
  const tld = parts[parts.length - 1];
  if (!/^[a-zA-Z]{2,}$/.test(tld)) return false;
  
  return true;
}

Решение 4: С поддержкой internationalized domain names

function isValidEmailInternational(email) {
  // Поддерживает Unicode в доменах
  const regex = /^[\p{L}\p{N}_.-]+@[\p{L}\p{N}.-]+\.[\p{L}]{2,}$/u;
  return regex.test(email);
}

// Использование
console.log(isValidEmailInternational("用户@例え.jp")); // true

Решение 5: Практическое решение для использования в приложении

interface ValidationResult {
  valid: boolean;
  error?: string;
}

function validateEmail(email: string): ValidationResult {
  // Базовая проверка
  if (!email || email.trim() === "") {
    return { valid: false, error: "Email не должен быть пустым" };
  }

  email = email.trim().toLowerCase();

  // Проверка длины
  if (email.length > 254) {
    return { valid: false, error: "Email слишком длинный" };
  }

  // Проверка @
  const atCount = (email.match(/@/g) || []).length;
  if (atCount !== 1) {
    return { valid: false, error: "Email должен содержать ровно один @" };
  }

  const [local, domain] = email.split('@');

  // Проверка local part
  if (!local || local.length > 64) {
    return { valid: false, error: "Локальная часть некорректна" };
  }

  if (!/^[a-zA-Z0-9._+-]+$/.test(local)) {
    return { valid: false, error: "Локальная часть содержит недопустимые символы" };
  }

  if (local.startsWith('.') || local.endsWith('.') || local.includes('..')) {
    return { valid: false, error: "Локальная часть содержит недопустимые точки" };
  }

  // Проверка domain
  if (!domain || domain.length < 3) {
    return { valid: false, error: "Домен некорректен" };
  }

  if (!domain.includes('.')) {
    return { valid: false, error: "Домен должен содержать точку" };
  }

  const domainParts = domain.split('.');
  
  for (const part of domainParts) {
    if (!part || part.length > 63) {
      return { valid: false, error: "Часть домена некорректна" };
    }
    if (!/^[a-zA-Z0-9-]*[a-zA-Z0-9]$/.test(part)) {
      return { valid: false, error: "Часть домена содержит недопустимые символы" };
    }
  }

  // Проверка TLD
  const tld = domainParts[domainParts.length - 1];
  if (!/^[a-zA-Z]{2,}$/.test(tld)) {
    return { valid: false, error: "TLD должен содержать минимум 2 буквы" };
  }

  return { valid: true };
}

// Использование
const result = validateEmail("test@example.com");
if (result.valid) {
  console.log("Email валиден");
} else {
  console.log("Ошибка:", result.error);
}

Сравнение подходов

РешениеПростотаГибкостьТочностьРекомендация
Regex простой✅✅LimitedBasic✅ Best
String методыGoodGoodProduction
Regex strict📊HighVery HighReal-world
International📊HighHighGlobal
С ошибками📊HighHighUX focused

Best Practices

  1. Не полагаться только на regex — пользователь может проверить email через ссылку
  2. Проверять на сервере — никогда не доверять клиенту
  3. Отправлять подтверждение — это единственная истинная проверка
  4. Быть реалистичным — RFC 5322 очень сложный
  5. Показывать ошибки — помогать пользователю исправить

Рекомендации для собеседования

  1. Начните с простого regex
  2. Объясните каждую часть regex
  3. Покажите версию без regex
  4. Обсудите граничные случаи
  5. Упомяните server-side валидацию и подтверждение

Итог: Простой regex для быстрой проверки. Более строгая валидация + подтверждение по email для реального приложения.

Создать функцию для валидации email | PrepBro