>当您从用户那里收集数据时,面临两个关键挑战。收集这些信息并验证它。某些类型的信息很简单 - 例如,某人的年龄并不是更简单的收集和验证。名字并不像听起来那样简单,但可以为您提供边缘案例和国际变化的餐饮(例如,顾客,手提义,甚至是具有连字符的姓氏的人),您不会出错(尽管很多应用程序和大量的应用程序和服务可以!)。电子邮件地址虽然从理论上讲非常容易验证,但面临着自己的挑战 - 但是,野外有很多正则表达不太正确。
,然后有电话号码。这些很难。真的很难。在本文中,我将讨论有关收集,验证和显示电话号码的一些挑战。钥匙要点
>
<br> 202-456-1111<br>
因此,基于这一点,我们知道正则表达式不像我们首先想到的那样简单 - 但这只是其中的一半。这些示例仅适用于美国的数字。当然,如果您知道要收集的数字将用于特定国家 /地区,则可以使用正则表达式。否则,这种方法将不会削减。
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
>各种外部因素可能对电话编号有影响。整个国家来来去去,引入了新的国家前缀。数字的新分类引入了新的编号系统 - 高级速率,本地利率,免费电话等。当运营商用完一组数字(可悲的是,高级利率)时,他们只是引入了一个新的前缀。
一些变化具有巨大的影响;例如,在几年前的英国,整个区域编号系统都发生了巨大的变化,几乎每个区域代码都插入了其他“ 1”。即使那样,首都也有一个微妙的系统。在全国范围内更改标牌以反映变化大概是十年的。
国际拨号代码
国家图书馆包含许多地理信息,其中包括国际拨号代码。这是来自国家 /地区的摘录。
如您所见,这表明奥地利使用国际拨号代码43.
那么我们如何使用此信息?好吧,使用lodash(或下划线)的魔法,我们可以通过几种方式查询与代码相关的信息。
> 例如,要找出给定的拨号代码是否有效:<br> 202-456-1111<br>
当然,
有更效率的方法可以做到这一点。
我们可以查找使用特定拨号代码的国家 /地区:>
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
>
>您会在文章附带的存储库中找到这些功能作为模块以及单元测试。
。 但是,即使是国际拨号代码,也并不像您想象的那样简单。格式可以变化 - 1,43,962 1868都是有效的代码。不一定是一对一的映射; 44例如,不仅用于英国,还用于马恩岛,根西岛和泽西岛。<br> 202 456 1111<br> (202) 456 1111<br> 2024561111<br> 1-202-456-1111<br> 1-202-456-1111 x1234<br> 1-202-456-1111 ext1234<br> 1 (202) 456-1111<br> 1.202.456.1111<br> 1/202/456/1111<br> 12024561111<br> +1 202 456 1111<br>
<br> 202-456-1111<br>
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
>
<br> 202 456 1111<br> (202) 456 1111<br> 2024561111<br> 1-202-456-1111<br> 1-202-456-1111 x1234<br> 1-202-456-1111 ext1234<br> 1 (202) 456-1111<br> 1.202.456.1111<br> 1/202/456/1111<br> 12024561111<br> +1 202 456 1111<br>
幸运的是,我们可以使用一种格式,使我们能够解决这些变化。
> e.164
<br> {<br> "name": {<br> "common": "Austria",<br> "official": "Republic of Austria",<br> // ... //<br> },<br> // ... //<br> "callingCode": ["43"],<br> // ... //<br> },<br>
有一个明确的,国际公认的电话号码,是世界上任何地方的电话号码,名为E.164。格式分解如下:
>电话号码的第一部分是国家代码
我们可以使用相同的格式,例如一个基于伦敦的英国号码:
>我们可以使用e.164格式表示任何有效的电话号码。我们知道它指的是哪个国家,而且毫无意义 - 使其成为存储的理想选择。它也通常用于基于电话的服务(例如SMS提供商),正如我们稍后会看到的。
>当然有一个渔获。 E.164标准可能非常适合存储,但对于两件事来说很可怕。首先,几乎没有人会以这种格式输入或读取其号码。其次,就其可读性而言,它是绝望的。但是,稍后,当我们看一下libphonenumber时,我们会发现有一些格式化数字的方法。<span>var _ = require('lodash') </span><span>, data = require('world-countries') </span>module<span>.exports = { </span><span>/** </span><span>* Determines whether a given international dialing code is valid </span><span>* </span><span>* <span>@param string code </span></span><span>* <span>@return bool </span></span><span>*/ </span><span>isValid : function(code) { </span><span>var codes = _.flatten(_.pluck(data, 'callingCode')); </span><span>return _.contains(codes, code); </span><span>} </span><span>// ... </span><span>}</span>
收集电话号码
首先,让我们看一下收集电话号码的问题。
><span>/** </span><span>* Gets a list of countries with the specified dialing code </span><span>* </span><span>* <span>@param string code </span></span><span>* <span>@return array An array of two-character country codes </span></span><span>*/ </span><span>getCountries : function(code) { </span><span>var countryEntries = _.filter(data, function(country){ </span><span>return (_.contains(country.callingCode, code)); </span><span>}) </span><span>return _.pluck(countryEntries, 'cca2'); </span><span>}</span>
> HTML5引入了一种新的“ TEL”输入类型。但是,由于格式的变化问题,它实际上并没有对用户可以输入的内容施加任何限制,也不会以与电子邮件元素相同的方式执行任何验证。但是,有一些优点 - 在移动网站上使用用户的电话键盘通常会显示,而不是常规的键盘布局。
您可以使用单个元素来收集一个数字:
或者,您可以将数字分解为单独的元素:
<br> 202-456-1111<br>
>浏览器支持非常好(例如,Chrome 6,Firefox 4,Safari 5,即10),但是即使在较旧的浏览器中,它也只会落到一个普通的旧文本字段。
>我们是否应该确定正则表达式足够 - 请记住,存在问题 - 然后我们可以使用模式属性添加一些验证:
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
但是,如果您知道某些数字将在特定范围内,则它们可以有效。这是给我们电话号码的蒙版输入的示例。
更好的方法
>您也可以在此处进行现场演示。
>用法很简单 - 确保您已包括jQuery,库和CSS文件,并且Flag Sprite可用并从CSS中正确引用 - 您会在build/img/flags.png中找到它。 。
接下来,创建一个元素:
最后,将其注入如下:
<br> 202 456 1111<br> (202) 456 1111<br> 2024561111<br> 1-202-456-1111<br> 1-202-456-1111 x1234<br> 1-202-456-1111 ext1234<br> 1 (202) 456-1111<br> 1.202.456.1111<br> 1/202/456/1111<br> 12024561111<br> +1 202 456 1111<br>
>有关配置选项的完整列表,请咨询文档。稍后,我们将查看Utilsscript选项,但首先,我们需要深入研究另一个有用的库。
<br> {<br> "name": {<br> "common": "Austria",<br> "official": "Republic of Austria",<br> // ... //<br> },<br> // ... //<br> "callingCode": ["43"],<br> // ... //<br> },<br>
幸运的是,我们许多验证和格式的困境都有解决方案。 Google的LibphoneNumber库最初是为Android操作系统开发的,提供了各种方法和用户用于使用电话号码的方法。更好的是,它已从Java移植到JavaScript,因此我们可以在Web或Node.js应用程序中使用它。
>>您可以从项目主页上下载库,如您所期望的 - Google Code。
您也可以通过NPM获得它。这是项目页面,然后从命令行安装:
您也可以使用Bower安装它:
<span>var _ = require('lodash') </span><span>, data = require('world-countries') </span>module<span>.exports = { </span><span>/** </span><span>* Determines whether a given international dialing code is valid </span><span>* </span><span>* <span>@param string code </span></span><span>* <span>@return bool </span></span><span>*/ </span><span>isValid : function(code) { </span><span>var codes = _.flatten(_.pluck(data, 'callingCode')); </span><span>return _.contains(codes, code); </span><span>} </span><span>// ... </span><span>}</span>
如果您正在考虑在前端项目中使用它,但是要警告 - 即使缩小和压缩,它也超过200kb。
>
首先,导入Phoneutil:现在,您可以使用其parse()方法来解释电话号码:
<br> 202-456-1111<br>
我们可以做很多事情。让我们首先从图书馆导入一些常数。将您的要求声明更改为以下内容:
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
现在我们可以执行以下操作:
><br> 202 456 1111<br> (202) 456 1111<br> 2024561111<br> 1-202-456-1111<br> 1-202-456-1111 x1234<br> 1-202-456-1111 ext1234<br> 1 (202) 456-1111<br> 1.202.456.1111<br> 1/202/456/1111<br> 12024561111<br> +1 202 456 1111<br>
的输出将如下:
<br> {<br> "name": {<br> "common": "Austria",<br> "official": "Republic of Austria",<br> // ... //<br> },<br> // ... //<br> "callingCode": ["43"],<br> // ... //<br> },<br>
现在尝试在没有国际拨号代码的情况下解析数字:
<span>var _ = require('lodash') </span><span>, data = require('world-countries') </span>module<span>.exports = { </span><span>/** </span><span>* Determines whether a given international dialing code is valid </span><span>* </span><span>* <span>@param string code </span></span><span>* <span>@return bool </span></span><span>*/ </span><span>isValid : function(code) { </span><span>var codes = _.flatten(_.pluck(data, 'callingCode')); </span><span>return _.contains(codes, code); </span><span>} </span><span>// ... </span><span>}</span>
这将抛出以下例外:
<span>/** </span><span>* Gets a list of countries with the specified dialing code </span><span>* </span><span>* <span>@param string code </span></span><span>* <span>@return array An array of two-character country codes </span></span><span>*/ </span><span>getCountries : function(code) { </span><span>var countryEntries = _.filter(data, function(country){ </span><span>return (_.contains(country.callingCode, code)); </span><span>}) </span><span>return _.pluck(countryEntries, 'cca2'); </span><span>}</span>
这是因为没有解释数字是为哪个国家,就无法解释。 parse()方法采用可选的第二个参数,即ISO 3166-1 alpha-2(即两个字符)国家代码。
如果您再次尝试这条线,但是这次将“我们”作为第二个论点,您会发现结果与以前一样:
<span>/** </span><span>* Gets the dialing codes for a given country </span><span>* </span><span>* <span>@param string country The two-character country code </span></span><span>* <span>@return array An array of strings representing the dialing codes </span></span><span>*/ </span><span>getCodes : function(country) { </span><span>// Get the country entry </span><span>var countryData = _.find(data, function(entry) { </span><span>return (entry.cca2 == country); </span><span>}); </span><span>// Return the code(s) </span><span>return countryData.callingCode; </span><span>}</span>
>您也可以使用这些格式来玩法;所有这些也将起作用:
<br> 020 7925 0918<br>
解释英国编号:
<br> +44 20 7925 0918<br>
>这将输出以下内容:
<br> 0044 20 7925 0918<br>
>分解一个数字后,您可以对其进行验证 - 正如我们在下一部分中所看到的。
验证一个数字
<br> 011 44 20 7925 0918<br>
这是一些有效数字的示例,其中将国家代码作为第二个参数提供,或者包含在第一个参数中:
如果您不提供国家代码,或者不含义,则会遇到与以前相同的错误:
以下是一些示例,其中验证失败,返回false:
<br> +12024561111<br>
但是,请警告
,因为一个无效的数字可能会引发例外:
<br> +442079250918<br>
确定数字类型
有时,知道电话号码的
<span><span><span><input</span> type<span>="tel"</span> name<span>="number"</span>></span></span>
该函数将解析的电话号码作为参数:
<span><!-- area code and number --> </span><span><span><span><input</span> type<span>="tel"</span> name<span>="number"</span>></span> </span><span><!-- country code, area code and number --> </span><span><span><span><input</span> type<span>="tel"</span> name<span>="country"</span> size<span>="4"</span>></span> <span><span><input</span> type<span>="tel"</span> name<span>="area"</span> size<span>="6"</span>></span> <span><span><input</span> type<span>="tel"</span> name<span>="number"</span> size<span>="8"</span>></span> </span><span><!-- US-style --> </span>(<span><span><span><input</span> type<span>="tel"</span> size<span>="3"</span>></span>) <span><span><input</span> type<span>="tel"</span> size<span>="3"</span>></span> - <span><span><input</span> type<span>="tel"</span> size<span>="4"</span>></span></span>
作为一个例子,让我们查询有关的数字是移动电话还是固定行:
<br> 202-456-1111<br>
>我们只需要更改我们的示例代码即可反映这种不确定性:
也有许多其他可能性。这是当前的完整列表:
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
pnt.fixed_line
>有很多电话号码可以验证,但不使用。他们可能已经断开连接,尚未分配,或者也许已经放下了厕所。
>一种方法是要求用户确认其电话号码,与您可能要求用户确认其电子邮件地址的方式几乎相同。您可以使用Twilio之类的服务发送SMS,甚至可以打电话。
>这是一个非常简单的代码段,用于使用Twilio通过SMS生成和发送确认代码
>然后,要求用户将代码输入您的Web应用程序中的表单以验证它是一个琐碎的练习 - 或者您甚至可以允许人们通过回复消息来验证其数字。
>也有(付费)服务,可以检查一个数字是否实时为您服务,例如Byteplant。其他问题
<br> 202 456 1111<br> (202) 456 1111<br> 2024561111<br> 1-202-456-1111<br> 1-202-456-1111 x1234<br> 1-202-456-1111 ext1234<br> 1 (202) 456-1111<br> 1.202.456.1111<br> 1/202/456/1111<br> 12024561111<br> +1 202 456 1111<br>
与任何个人信息一样,也有很多法律问题要注意。例如,在英国,电话偏好服务(TPS)是全国电话号码登记册,已由不希望接收营销通信的人们进行了解释。有付费服务提供API来检查针对此登记册的数字。
>可用性注意事项
>您可能还记得jQuery插件具有一个名为utilsscript的较神秘的选项。
此选项使我们能够利用LibphoneNumber的验证和格式化功能。选择一个国家(使用下拉列表或键入拨号代码)之后,它将将文本场转换为蒙版的输入,以反映该国家的编号格式。
该插件包含libphoneNumber包装的版本;如下:
<br> 202-456-1111<br>
显示电话号码
> 为此,我们需要链接本身的e.164格式 - 例如:
>当然,您可以使用LibphoneNumber库的格式()方法来渲染e.164版本(pnf.e164)和更具用户友好的显示版本。
microdata>我们还可以使用MicroDATA以语义标记电话号码。这是一个例子;请注意使用itemprop =“电话”来标记链接:
<br> ^(\([0-9]{3}\)|[0-9]{3}-)[0-9]{3}-[0-9]{4}$<br>
在本文中,我们打开了黄蜂巢是电话号码。到目前
我们已经研究了一些用于收集数字的方法 - “ TEL”输入类型,掩盖输入和INTL-TEL输入jQuery插件。 然后,我们查看了有关验证的一些问题,以及为什么诸如正则表达式之类的常见方法通常不足,尤其是当您国际化时。我们看了Google的LibphoneNumber图书馆;使用它来解析,验证,显示和确定电话号码的类型。
><br> 202 456 1111<br> (202) 456 1111<br> 2024561111<br> 1-202-456-1111<br> 1-202-456-1111 x1234<br> 1-202-456-1111 ext1234<br> 1 (202) 456-1111<br> 1.202.456.1111<br> 1/202/456/1111<br> 12024561111<br> +1 202 456 1111<br>
>由于各种国际电话号码格式,在JavaScript中验证使用国家代码的电话号码可能是一项复杂的任务。为了确保准确的验证,一种有效的方法是使用Google使用“ LibphoneNumber”库。该库提供了用于解析,格式化和验证电话号码的全面工具,使其成为为此目的的可靠选择。
要开始使用,您需要使用NPM安装“ LibphoneNumber”库,然后将其导入到JavaScript文件中。导入后,您可以利用图书馆的Phonenumberutil类执行电话号码验证。具体来说,ISVALIDNUMBER函数允许您验证一个解析的电话号码,如果该号码有效或错误,则返回true。通过使用图书馆的功能来解析电话号码,您可以确保其遵守与所提供的国家 /地区代码相关的特定格式和规则。
此方法为使用国家 /地区代码验证电话号码提供了强大的解决方案,提供了准确的手段处理具有不同格式和标准的国际电话号码。通过实施“ LibphoneNumber”库,您可以显着提高JavaScript应用程序中电话号码验证的精确性和可靠性。
一旦您拥有正则表达式模式,就可以使用EXEC方法将其应用于电话号码。 EXEC方法返回包含电话号码的匹配部分和任何捕获组的数组。在这种情况下,可以从数组中的第一组访问捕获的国家代码(索引1)。通过遵循此过程,您可以准确地将国家代码与电话号码分开,并可以在JavaScript应用程序中进一步使用。
此方法用途广泛,并且可以适应各种电话号码格式。无论您是处理用户输入还是从外部来源处理电话号码,此方法都可以确保您可以可靠地提取国家代码,这是使用国际电话号码的宝贵一步。
>格式化电话号码以确保不同地区的清晰度和兼容性至关重要。国际格式的电话号码通常由三个主要组件组成:国家代码,区域代码(如果适用)和本地电话号码。国家代码以加号()为代表,然后是数字代码,例如美国的1。它是该国或地区的普遍认可的标识符。
在某些情况下,可能包括区域代码,通常与空间或连字符的数字分开。以下是本地电话号码,该号码的长度可能会有所不同,并且可能包含其他分离器或标点符号。国家之间的特定格式可能会有所不同,因此重要的是在可用的情况下遵循当地惯例。通过遵守此结构,您可以确保在国际边界中易于识别和可用的电话号码。
以上是在JavaScript中使用电话号码的详细内容。更多信息请关注PHP中文网其他相关文章!