Форматируете номер телефона определенным образом?

Это не дубликат, связанный поток не объясняет, как этого добиться.

Я хочу получить номер телефона в определенном формате.

+ хх (х) ххх ххх хххх

  • Код страны.
  • Космос.
  • Ноль в скобках.
  • Космос.
  • 3 цифры.
  • Космос.
  • 3 цифры.
  • Космос.
  • 4 цифры.

Пользователь может ввести что угодно (но всегда должно быть число +61). Пока я пробовал следующее.

  • Удаление пробелов и нечисловых символов.
  • Если начинается с нуля, удалите.
  • Если начинается с 610, удалите.
  • Если начинается с 61, удалите.
  • Повторно добавьте код страны в определенном формате, а остальная часть номера телефона - в формате 3,3,4.

Мой вопрос - есть ли способ просто привести к одному выражению?

    value = value.replace(/\D/g,'');
    value = value.startsWith(0) ? value.substring(1) : value;
    value = value.startsWith('610') ? value.substring(3) : value;
    value = value.startsWith('61') ? value.substring(2) : value;
    value = '+61 (0) ' + value.replace(/\d{3,4}?(?=...)/g, '$& ');

Извините, JS - был долгий день!

panthro 23.10.2018 15:12

Вы пытаетесь создать регулярное выражение, которое проверяет номер мобильного телефона?

Pushpesh Kumar Rajwanshi 23.10.2018 15:18

Не дубликат.

panthro 23.10.2018 15:22

Не могли бы вы привести примеры правильного / неправильного ввода?

Poul Bak 23.10.2018 15:29

Вход может быть любым xgsh6101231231234vvajx, и это будет преобразовано в +61 (0) 123 123 1234

panthro 23.10.2018 15:31
\D|^(0+|610|61) на ничто и (.{3})(.{3})(.{2})(.{2}) на +61 (0) $1 $2 $3 $4
splash58 23.10.2018 15:31

splash58 не могли бы вы объяснить свой комментарий подробнее?

panthro 23.10.2018 15:32
regex101.com/r/i15YCn/1 и regex101.com/r/i15YCn/2
splash58 23.10.2018 15:36

splash58 все еще не уверен, что здесь происходит.

panthro 23.10.2018 15:39

@panthro Сработал ли для вас какой-либо из предоставленных ответов?

The fourth bird 25.10.2018 19:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
11
142
2

Ответы 2

Чтобы расширить и объяснить комментарий @ splash58, они предлагают использовать два регулярных выражения для полной замены, которую вы хотите. Первый (/\D|(0+|610|61)/gi) удалит все нежелательные символы в строке. Второй (/(\d{3})(\d{3})(\d{4})/gi) будет принимать оставшиеся цифры и фиксировать нужные группы, чтобы вы могли их отформатировать по своему усмотрению. Я настоятельно рекомендую посмотреть ссылки regex101, которые они предоставили, поскольку этот сайт полностью объяснит, как и почему данное выражение соответствует тому, что оно делает справа.

Укороченная версия:

/\D|(0+|610|61)/gi будет соответствовать любому НЕ-цифровому символу ИЛИ строке нулей, «610» или «61». Замените это ничем, чтобы удалить

/(\d{3})(\d{3})(\d{4})/gi будет соответствовать строке из 10 цифр и групп захвата, это то, что означают круглые скобки, из 3 цифр, 3 цифр и 4 цифр. При замене на них можно ссылаться как на идентификаторы $1, $2 и $3 в соответствии с их положением.

Собираем все вместе:

// look in a string and return formatted phone number only
function phone(str) {
    str = str.replace(/\D|(0+|610|61)/gi, '');
    str = str.replace(/(\d{3})(\d{3})(\d{4})/gi, '+61 (0) $1 $2 $3');
    return str;
}
console.info(phone('xgsh6101231231234vvajx'));
console.info(phone('+6101231231234'));

Я бы также рекомендовал сначала выполнить поиск по всей входной строке для ряда чисел или пробелов, чтобы получить меньше ложных срабатываний. Это можно сделать с помощью регулярного выражения типа /[\d\s]+/.

Спасибо, но приведенное выше не работает, если пользователь вводит +6101231231234 Он добавляет еще 61 в номер телефона после +61 (0) 61 ....

panthro 23.10.2018 18:35

Только добавьте \+? в регулярное выражение

splash58 23.10.2018 19:03

@panthro И будет лучше показать примеры ввода, который вы ожидаете

splash58 23.10.2018 19:04

@panthro, вы уверены, что реализовали это, как показано? ввод, который вы только что предоставили, отлично подходит для меня. Я добавил к примеру, и если вы сейчас нажмете «Выполнить», вы увидите, что здесь он работает.

jjspace 23.10.2018 19:08

Вы можете сопоставить номер, используя:

^.*?\+?0*610?(\d{3})(\d{3})(\d{4})(?!\d).*$

Демо Regex

И замените на:

+61 (0) $1 $2 $3

Объяснение

  • ^ Подтвердить начало строки
  • .*? Совпадение 0+ символов без жадности
  • \+? Соответствует необязательному знаку плюс
  • 0*610? Совпадение 0+ раз на ноль, 61 с необязательным нулем
  • (\d{3})(\d{3})(\d{4}) соответствует 3 группам с 3, 3 и 4 цифрами
  • (?!\d) Отрицательный просмотр вперед, чтобы утверждать, что следующее не является цифрой
  • .* Соответствует 0+ символов
  • $ Подтвердить конец строки

const strings = [
  "xgsh6101231231234vvajx",
  "xgsh06101231231234vvajx",
  "xgsh000006101231231234vvajx",
  "+6101231231234",
  "xgsh61012312312345vvajx",
  "xgsh5101231231234vvajx",
  "xgsh00000101231231234vvajx",
  "xgsh6143545626455345601231231234vvajx"
];
let pattern = /^.*?\+?0*610?(\d{3})(\d{3})(\d{4})(?!\d).*$/;

strings.forEach((s) => {
  console.info(s.replace(pattern, "+61 (0) $1 $2 $3"));
});

Другие вопросы по теме