我需要一个正则表达式来将美国电话号码转换为链接

时间:2010-07-21 18:23:31

标签: c# regex hyperlink tel

基本上,输入字段只是一个字符串。人们以各种格式输入他们的电话号码。我需要一个正则表达式来查找并将这些数字转换为链接。

输入示例:

(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);

任何人都可以通过修复此建议或建议更好的方法来帮助我吗?

修改

谢谢大家。这是我到目前为止所得到的:

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

3 个答案:

答案 0 :(得分:1)

移除[]并在每个\s*周围添加\-(零个或多个空格字符)。

此外,您无需转义-。 (您可以从\

中取出\-

说明:[abcA-Z]字符组,匹配abc或{{1}之间的任何字符}和A
这不是你想要做的。


编辑

回复您更新的正则表达式:

  • Z更改为[-\.\s]以匹配其中任何一个或多个字符(例如,[-\.\s]+周围有空格)
  • 问题是-与空格和\b之间的边界不匹配。

答案 1 :(得分:1)

Afaik,没有手机输入其他字符,为什么不用[^0-9]替换''

答案 2 :(得分:1)

这是我用来查找电话号码的正则表达式:

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

它非常灵活......允许各种格式。

然后,使用一堆后引用而不是杀死自己试图用空格替换它,而是将匹配传递给函数,然后根据需要剥离空格。

C#/。net 应该有一个允许函数作为替换参数的方法......

编辑:他们称之为“MatchEvaluator。该示例使用委托,但我很确定您可以使用稍微不那么详细的

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

或者其他什么。在这里工作。