在后端存储电话号码时,考虑效率、标准化、验证和国际化至关重要。存储电话号码的最佳方式通常取决于应用程序的需求(例如国际支持、验证规则、格式要求)。
此方法以国际 E.164 格式(这是国际公认的电话号码格式)存储完整的电话号码,包括国家/地区代码。
一致性:通过以 E.164 格式存储电话号码,可以避免不同用户和系统之间的格式不一致。
验证:您可以使用 libphonenumber(Google 使用)等库轻松验证电话号码,以验证电话号码格式正确且对于特定国家/地区有效。
数据库架构:将电话号码存储为 E.164 格式的单个字符串字段。
字段类型:String 或 VARCHAR(取决于数据库)。
示例:VARCHAR(15)(E.164 最多允许 15 位数字)。
CREATE TABLE users ( id INT PRIMARY KEY, phone_number VARCHAR(15) NOT NULL );
在此方法中,您将电话号码分为两个字段:一个用于国家/地区代码,另一个用于本地号码。这为本地化格式提供了更大的灵活性,如果您的应用程序需要按区域划分不同的电话号码行为(例如验证规则、格式显示),这可能会更好。
CREATE TABLE users ( id INT PRIMARY KEY, phone_number VARCHAR(15) NOT NULL );
以下是处理 E.164 格式的电话号码和 libphonenumber 以在 Node.js 中进行验证的完整示例:
CREATE TABLE users ( id INT PRIMARY KEY, country_code VARCHAR(5) NOT NULL, local_number VARCHAR(20) NOT NULL );
npm install google-libphonenumber
要使用此库从电话号码检索国家/地区代码(例如 US 表示美国),您可以使用 getRegionCodeForNumber 函数。此函数接受一个电话号码(必须使用 parseAndKeepRawInput 或类似方法进行解析)并返回 ISO 3166-1 alpha-2 格式的国家/地区代码(例如 IN、US、GB 等)。
const { PhoneNumberUtil, PhoneNumberFormat } = require('google-libphonenumber'); const phoneUtil = PhoneNumberUtil.getInstance(); const validatePhoneNumber = (phoneNumber, countryCode) => { try { const number = phoneUtil.parseAndKeepRawInput(phoneNumber, countryCode); const isValid = phoneUtil.isValidNumber(number); const formattedNumber = phoneUtil.format(number, PhoneNumberFormat.E164); return { isValid, formattedNumber }; } catch (error) { return { isValid: false, error: 'Invalid phone number' }; } }; // Example usage const { isValid, formattedNumber } = validatePhoneNumber('800-555-5555', 'US'); console.log(isValid, formattedNumber); // true, +18005555555
parseAndKeepRawInput(phoneNumber):
此方法用于解析电话号码并保留原始输入,这意味着它可以处理各种格式的输入(例如,带有空格、破折号或括号)。
getRegionCodeForNumber(number):
此函数返回与解析的电话号码关联的国家/地区代码(ISO 3166-1 alpha-2 代码,例如 IN、US、GB 等)。
它通过将号码与特定于国家/地区的电话号码模式的内部列表进行匹配来实现此目的。
const { PhoneNumberUtil } = require('google-libphonenumber'); const phoneUtil = PhoneNumberUtil.getInstance(); // Function to get country code (ISO 3166-1 alpha-2) const getCountryCodeFromPhoneNumber = (phoneNumber) => { try { // Parse the phone number and get the region (country code) const number = phoneUtil.parseAndKeepRawInput(phoneNumber); const countryCode = phoneUtil.getRegionCodeForNumber(number); return countryCode; } catch (error) { console.error("Error parsing phone number:", error); return null; } }; // Test with different phone numbers const testPhoneNumbers = [ "+919167988354", // India "+14155552671", // USA "+447777123456", // UK "+81 90 1234 5678", // Japan ]; testPhoneNumbers.forEach((phoneNumber) => { const countryCode = getCountryCodeFromPhoneNumber(phoneNumber); console.log(`Phone number: ${phoneNumber}, Country Code: ${countryCode}`); });
电话号码必须正确解析,并且应包含国家/地区代码(后跟数字)。如果电话号码是本地格式(不带国家代码),则解析时需要指定默认地区(国家)。
默认区域:如果电话号码不包含国家/地区代码,您可以使用 parse 方法提供默认国家/地区代码(例如,phoneUtil.parse(phoneNumber, 'IN' ) 代表印度)。
以上是在应用程序中存储电话号码的最佳方式的详细内容。更多信息请关注PHP中文网其他相关文章!