Мне нужно регулярное выражение для преобразования номера телефона США в ссылку - PullRequest
2 голосов
/ 21 июля 2010

По сути, поле ввода - это просто строка. Люди вводят свой номер телефона в различных форматах. Мне нужно регулярное выражение, чтобы найти и преобразовать эти числа в ссылки.

Примеры ввода:

(201) 555-1212
(201)555-1212
201-555-1212
555-1212

Вот что я хочу:

<a href="tel:(201)555-1212">(201) 555-1212</a> - Notice the space is gone
<a href="tel:(201)555-1212">(201)555-1212</a>
<a href="tel:201-555-1212">201-555-1212</a>
<a href="tel:555-1212">555-1212</a>

Я знаю, что это должно быть более надежно, чем просто удаление пробелов, но для внутреннего веб-сайта мои сотрудники будут получать доступ со своего iPhone. Итак, я готов "просто заставить его работать".

Вот что у меня есть в C # (что должно показать вам, как мало я знаю о регулярных выражениях):

strchk = Regex.Replace(strchk, @"\b([\d{3}\-\d{4}|\d{3}\-\d{3}\-\d{4}|\(\d{3}\)\d{3}\-\d{4}])\b", "<a href='tel:$&'>$&</a>", RegexOptions.IgnoreCase);

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

EDIT:

Спасибо всем. Вот что у меня так далеко:

strchk = Regex.Replace(strchk, @"\b(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})\b", "<a href='tel:$1'>$1</a>", RegexOptions.IgnoreCase);

Он собирает почти все, кроме тех, у кого (nnn) коды города, с пробелами между ними и семизначным числом или без них. Он берет 7-значный номер и связывает его таким образом. Однако, если указан код города, он не сопоставляется. Есть идеи, что я делаю не так?

Второе редактирование:

Теперь все работает. Все, что я сделал, это удалил \b из начала строки.

Ответы [ 3 ]

1 голос
/ 21 июля 2010

Афаик, телефон не вводит другие символы, так почему бы не заменить [^0-9] на ''?

1 голос
/ 21 июля 2010

Вот регулярное выражение, которое я написал для поиска телефонных номеров:

(\+?\d[-\.\s]?)?(\(\d{3}\)\s?|\d{3}[-\.\s]?)\d{3}[-\.\s]?\d{4}

Это довольно гибкий ... допускает множество форматов.

Затем, вместо того, чтобы убивать себя, пытаясь заменить его пробелами без использования обратных ссылок, вместо этого передавайте соответствие функции и просто убирайте пробелы, как вы хотели.

C # /. Net должен иметь метод, который позволяет функции в качестве аргумента замены ...

Редактировать: Они называют это ` MatchEvaluator . В этом примере используется делегат, но я уверен, что вы могли бы использовать чуть менее подробный

(m) => m.Value.Replace(' ', '')

или что-то в этом роде. работая по памяти здесь.

1 голос
/ 21 июля 2010

Удалите [] и добавьте \s* (ноль или более пробельных символов) вокруг каждого \-.

Также вам не нужно экранировать -.(Вы можете извлечь \ из \-)

Объяснение: [abcA-Z] - это группа символов , которая соответствует a, b, c,или любой символ между A и Z.
Это не то, что вы пытаетесь сделать.


Редактирует

В ответ на ваше обновленное регулярное выражение:

  • Измените [-\.\s] на [-\.\s]+, чтобы соответствовать одному или нескольким из этих символов (например, - с пробелами вокруг него)
  • Проблема в том, что \bне соответствует границе между пробелом и (.
...