Javascript中的电话号码识别

Posted

技术标签:

【中文标题】Javascript中的电话号码识别【英文标题】:Phone Number Recognition in Javascript 【发布时间】:2011-02-17 22:11:24 【问题描述】:

是否有可以识别网页中电话号码的 javascript 库?就像 Skype 在他们的 Firefox 插件上所做的那样。

或者你知道怎么做吗?网站或任何类似的教程都会非常有帮助。

非常感谢您的回复。

最好的,

【问题讨论】:

可以使用正则表达式来查找电话号码。一个非常基本的例子是/\d\d\d-\d\d\d-\d\d\d\d/。但是你想用你找到的数字做什么? 我想将页面中的所有电话号码转换为链接。然后我会将它连接到我的应用程序中。单击链接时可能会显示一个弹出窗口。 您可以随时查看 Skype 是如何做到的。下载 FF 扩展名(.xpi 文件)然后解压缩它(.xpi 只是 .zip 的不同名称)并开始查看。我自己没有这样做,所以我不知道它是否容易找到,但值得一试。让我们知道您的发现! 【参考方案1】:
var makePhoneLinks = function()

    var tNodes = [];
    getTextNodes(document.body,false,tNodes,/(((\(\d3\) ?)|(\d3-))?\d3-\d4)/ig);                              
    var l = tNodes.length;
    while(l--)
    
        wrapNode(tNodes[l],/(((\(\d3\) ?)|(\d3-))?\d3-\d4)/ig,"<a target='#'>$1</a>");
      

function getTextNodes(node, includeWhitespaceNodes,textNodes,match) 

    if (node.nodeType == 3) 
        if (includeWhitespaceNodes || !/^\s*$/.test(node.nodeValue)) 
            if(match)
                if(match.test(node.nodeValue))
                    textNodes.push(node);
            
            else 
                textNodes.push(node);
            
        
     else 
        for (var i = 0, len = node.childNodes.length; i < len; ++i) 
            getTextNodes(node.childNodes[i],includeWhitespaceNodes,textNodes,match);
        
    


function wrapNode(n,match,m) 

    var temp = document.createElement('div');
    if(n.data)
        temp.innerhtml = n.data.replace(match, m);
    else
        //whatever
    
    while (temp.firstChild) 
        n.parentNode.insertBefore(temp.firstChild,n);

    
    n.parentNode.removeChild(n);


【讨论】:

【参考方案2】:

其他人可能有更好的方法来执行此操作,但这似乎为您提供了每个电话号码周围的链接。

我只是使用了我的简单正则表达式,因此您可能想要替换 Adam 提供的那个。

$(document).ready(function () 

    $('*','body').each(function() 
        $(this).html( $(this).html().replace(/(\d\d\d-\d\d\d-\d\d\d\d)/g,'<a href="#">$1</a>') );
    );

);

希望对你有帮助。


编辑:

这个版本可能也能正常工作,或者更好。

$(document).ready(function () 
    $('body').html( $('body').html().replace(/(\d\d\d-\d\d\d-\d\d\d\d)/g,'<a href="#">$1</a>') );
);

我不知道是否有任何陷阱,但似乎可以使用一个相当简单的页面。

【讨论】:

【参考方案3】:

要在字符串中查找匹配项,您需要使用regular expression。这个(虽然有点长)效果很好:

^(1\s*[-\/\.]?)?(\((\d3)\)|(\d3))\s*[-\/\.]?\s*(\d3)\s*[-\/\.]?\s*(\d4)\s*(([xX]|[eE][xX][tT])\.?\s*(\d+))*$

(找到here)

这将匹配“2405525009”、“1(240) 652-5009”和“240/752-5009 ext.55”,但不匹配“(2405525009”或“2 (240) 652-5009”。

要查找所有匹配项,您可能需要在while 循环中重复应用exec() 方法,如here 所示。

【讨论】:

感谢您的回复。是的,正则表达式几乎是工具,但我不希望我的页面上有任何输入框。我只想爬到页面并识别这些电话号码,然后将其转换为链接。

以上是关于Javascript中的电话号码识别的主要内容,如果未能解决你的问题,请参考以下文章

如何让 PhoneNumberUtil 识别数组?

html Html代码(普通javascript),可以跟踪Google Analytics中的电话号码点击次数

javascript中的字典

Javascript匹配电子邮件电话号码和字符串中的特殊字符(textarea)

智能识别电话号码和文字(包括国际号码)

基于PaddleLite的OCR识别身份证号码应用