Сложно не реализовать это в jquery, а найти алгоритм, который сделает ваше форматирование.
Вам необходимо сопоставить части входных данных с частями желаемого шаблона.Возможно, если бы вы начали со спины, вы могли бы назначить номера фактической части номера телефона и включить пробелы, где это необходимо;затем, когда вы выйдете вперед с отсутствующим (), вы заметите, что когда вы достигнете 0, вам не хватает закрывающей скобки, чтобы вы могли вставить ее.То же самое для закрывающей скобки, когда вы читаете конец ввода, но ожидаете открывающей скобки.,Теперь у вас нет ввода, но у вас все еще есть международный +44 в желаемом шаблоне, поэтому вы просто предполагаете, что пользователь забыл добавить его и добавить его для него.
Для телефонных номеров это кажется простымпуть, потому что когда вы что-то пропускаете, это всегда в начале (международный код или код города).
В более общем смысле, сопоставление подвыражений желаемого формата в фактическом вводе будет работать до тех пор, покафактический ввод имеет только одну интерпретацию (если символ ввода может быть частью либо одного подвыражения, либо другого, то вам придется объяснить пользователю, почему ваш алгоритм иногда делает «неправильные» действия при расширении его ввода доВаш желаемый формат.
Сопоставление подвыражений может быть выполнено с помощью регулярных выражений в javascript, поэтому вам не нужно писать собственный сопоставитель выражений. Используйте группировку подвыражений, а затем объединяйте сопоставленные группы, используя конкатенацию строк, вставляя форматированиесимволы междусоответствующие группы по мере необходимости.
Вот небольшой пример того, что я имею в виду:
function format_phonenumber(unformatted) {
var regex = /(\d{3})(\s*-?\s*)(\d{3})\s*(\d{4})/gi;
var m = regex.exec(unformatted)
return m[1] + "-" + m[3] + " " + m[4];
}
/* unformatted junk */
var junk = "5551234567";
alert("Formatted: " + format_phonenumber(junk));
Вы можете изменить мусор на "555 1234567" или 555-1234567 "и т. д., и группы соответствия будутпо-прежнему сопоставляйте правильные подвыражения и производите красиво отформатированный вывод «555-123 4567» (я не знаю, как вы форматируете свои телефонные номера, но вы поняли идею).Но все зависит от того, насколько умным является ваше подвыражение.Конечно, описанный выше модуль форматирования должен иметь отказоустойчивую систему, поэтому, если регулярное выражение не совпадает, вы получите исходную неформатированную строку вместо фактического фрагмента мусора.
Теперь, если вы дадитеПоле ввода в вопросе идентификатор, вы можете прикрепить к нему прослушиватель событий, который будет считывать данные в поле ввода, запускать их через ваш форматтер и сохранять их обратно в текстовое поле с помощью jquery следующим образом:
var unformatted = $("#myinputbox").val();
var formatted = format_phonenumber(unformatted);
$("#myinputbox").val(formatted);