2010-07-21 1 views
2

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

Входные примеры:

(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 цифр. Он выбирает 7-значный номер и связывает его таким образом. Однако, если код области указан, он не подходит. Любая идея, что я делаю неправильно?

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

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

+0

Какие источники вы ожидаете? Разве вы не можете просто удалить все пробелы? – NullUserException

+0

Номера телефонов иногда расположены в больших блоках текста. – BoltBait

ответ

1

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

Кроме того, вам не нужно избегать -. (Вы можете вынуть \ из \-)

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


редактирует

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

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

Спасибо за урок регулярных выражений. Не могли бы вы взглянуть на мое редактирование, чтобы узнать, что еще не так? – BoltBait

+0

Это был ключ. Я удалил «\ b» с самого начала, и теперь он поднимает все. – BoltBait

1

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

+0

Вот что я делаю. Вместо того, чтобы пытаться думать обо всех возможных альтернативах, просто игнорируйте любое форматирование и получайте цифры. –

1

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

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

Это довольно гибкая ... позволяет различные форматы.

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

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

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

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

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

+0

Спасибо. Я использовал вашу идею «[- \. \ S]» в моем переработанном коде. – BoltBait