代码之家  ›  专栏  ›  技术社区  ›  BoltBait

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

  •  2
  • BoltBait  · 技术社区  · 15 年前

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

    输入示例:

    (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 回复  |  直到 15 年前
        1
  •  1
  •   SLaks    15 年前

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

    另外,你不需要逃避 - . (你可以取出 \ - )

    说明: [abcA-Z] 是一个 字符群 哪些匹配 a , b , c 或介于 A Z .
    这不是你想做的。


    编辑

    响应您更新的regex:

    • 变化 [-\.\s] [-\.\s]+ 匹配这些字符中的一个或多个(例如 - 周围有空间)
    • 问题是 \b 不匹配空间和 ( .
        2
  •  1
  •   Wrikken    15 年前

    阿法克,没有手机输入其他字符,为什么不替换呢? [^0-9] 具有 '' ?

        3
  •  1
  •   mpen    15 年前

    这是我为寻找电话号码而写的一个regex:

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

    它很灵活…允许多种格式。

    然后,不要用一堆后面的引用来替换它,而是将匹配传递给一个函数,然后根据需要去掉空格。

    C.//NET 应该 有一个方法允许函数作为替换参数…

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

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

    或者什么的。在记忆中工作。

    推荐文章