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

任何人都可以通过解决此问题或提出更好的方法来帮助我吗?

编辑:

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

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从字符串的开头删除。

4

3 回答 3

2

删除[]\s*在每个\-.

此外,您不需要转义-. (您可以取出\from \-

解释:[abcA-Z]是一个字符组,它匹配a, b, , 或和c之间的任何字符。 这不是你想要做的。AZ


编辑

响应您更新的正则表达式:

  • 更改[-\.\s][-\.\s]+以匹配这些字符中的一个或多个(例如,a-周围有空格)
  • 问题是\b与空格和 . 之间的边界不匹配(
于 2010-07-21T18:27:27.593 回答
1

Afaik,没有电话输入其他字符,那么为什么不替换[^0-9]''

于 2010-07-21T18:27:37.853 回答
1

这是我为查找电话号码而编写的正则表达式:

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

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

然后,与其杀死自己试图使用一堆反向引用来替换它而没有空格,而是将匹配传递给一个函数并根据需要去除空格。

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

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

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

或者其他的东西。在这里从记忆中工作。

于 2010-07-21T18:31:43.103 回答