2010-05-10 47 views
3

有没有一个JavaScript库可以识别网页中的电话号码?就像Skype在他们的Firefox插件上做的一样。使用Javascript的电话号码识别

或者你知道如何做到这一点吗?网站或任何相同的教程将会非常有帮助。

非常感谢您的回复。

最佳,

+0

正则表达式可用于查找电话号码。一个非常基本的将会是'/ \ d \ d \ d- \ d \ d \ d- \ d \ d \ d \ d /'。但是你想用你找到的数字来做什么? – user113716 2010-05-10 23:33:19

+0

我想将页面中的所有电话号码转换为链接。然后我会把它连接到我的应用程序中。链接被点击时可能会弹出一个窗口。 – 2010-05-10 23:44:16

+0

你总是可以看看Skype是如何做到的。下载FF扩展名(.xpi文件),然后解压缩(.xpi只是使用不同名称的.zip)并开始环视。我自己没有这样做,所以我不知道它是否容易找到,但值得一试。让我们知道你发现什么! – MatrixFrog 2010-06-18 20:35:32

回答

2

其他人可能有更好的方法o这样做,但这似乎给你一个链接每个电话号码。

我刚刚使用了我的简单正则表达式,因此您可能需要替换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>')); 
}); 

我不知道是否有任何陷阱,但似乎有一个非常简单的页面正常工作。

2

要查找的字符串匹配之内,你要使用regular expression。这一个(虽然有些冗长)工作得很好:

^(1\s*[-\/\.]?)?(\((\d{3})\)|(\d{3}))\s*[-\/\.]?\s*(\d{3})\s*[-\/\.]?\s*(\d{4})\s*(([xX]|[eE][xX][tT])\.?\s*(\d+))*$ 

(发现here

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

要查找所有的比赛,你可能要反复应用exec()方法在while环,如图here

+0

感谢您的回复。是的,正则表达式几乎是该工具,但我不希望我的页面上有任何输入框。我只是想抓取页面,并识别这些电话号码,然后将其转换为链接。 – 2010-05-10 23:47:35

3
var makePhoneLinks = function() 
{ 
    var tNodes = []; 
    getTextNodes(document.body,false,tNodes,/(((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4})/ig);        
    var l = tNodes.length; 
    while(l--) 
    { 
     wrapNode(tNodes[l],/(((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4})/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); 

}