美文网首页
小程序、js智能拆分姓名、电话号码、地址信息

小程序、js智能拆分姓名、电话号码、地址信息

作者: 姬歌 | 来源:发表于2021-01-21 17:46 被阅读0次

    用法:以下格式均可准确判断。分隔符可为逗号(中|英文),分号(中|英文),顿号,空格等
    字符串前面、后面有空格、换行符也可以。中间有换行符也可以。
    程序可解析常见的地址、电话信息,有一定的容错处理(常见错误写法,一般性错误)能力。比如自治区写成XX区,或自治区没写对全称,或省份没写‘省’字,市没有‘市’字等等。字符串前后有无双引号皆可,引号不对称也可以。电话号码可以是手机号,也可以是座机号。手机号可包+86,(+86),(+86) +86 - xxx等等。座机号也有类似容错功能。第一个可见字符、最后一个可见字符是引号都可以,会自动删除前后引号
    当然啦,如果格式错得离谱,或人都不易辨认了,程序肯定是无法准确解析的。
    【用法示例】:

        let address1 = "王力龙 15888881478广东省深圳市南山区深南大道9037号世界之窗(欧陆风情街) "
        let address2 = "谢顶峰,15888889527,广东省深圳市罗湖区莲塘街道仙湖社区仙湖路160号"
        let address3 = "李连加,广东深圳市南山区南山大道1088号南园枫叶大厦,15888881999"
        let address4 = "15986554235 苗娇伟,深圳市南山区南油 创业路98号亿利达大厦"
        let address5 = "马化云15888888888:广东深圳南山区科技园内、后海大道与滨海大道的交汇处,腾讯滨海大厦"
    let address6 = "      “
    王力龙 
    15888881478,
    广东省深圳市南山区深南大道9037号世界之窗(欧陆风情街) 
    \"
    "
    
        let result1 = smartAddress.processAddress(address1)
        console.log("name=" + result1.name + ",phone=" + result1.phone+ ",address=" + result1.address)
    

    【用法示例】:
    对上一步骤截取出来的纯地址串再加工:

    let address = "广东深圳市南山区南山大道1088号南园枫叶大厦"
    
        qqmapsdk.geocoder({
          address: address,
          success: res => {
              let result = res.result
              if (result) {
                let component = result.address_components
                 if (component) {
                    let province = component.province
                    let city = component.city
                    let district = component.district
                    console.log(province + city + district)
    //注意,必须依次调用removeProvinceName,removeCityName,removeDistrictName,否则操作无效
                    let addressResult = smartAddress.removeProvinceName(address, province)
                    console.log(addressResult.address)
                    let addressResult2 = smartAddress.removeCityName(addressResult.address, city)
                    console.log(addressResult2.address)
                    let addressResult3 = smartAddress.removeDistrictName(addressResult2.address, district)
                    console.log(addressResult3.address)
                 }
                 let location = result.location
                 if (location) {
                   let lng = location.lng
                   let lat = location.lat
                   console.log("lng=" + lng + ", lat=" + lat)
                }
              }
          },
        fail: function(res) {
          }
      });
    

    打印结果:

    广东省深圳市南山区
    深圳市南山区南山大道1088号南园枫叶大厦
    南山区南山大道1088号南园枫叶大厦
    南山大道1088号南园枫叶大厦
    lng=113.921539, lat=22.51679


    进入页面后,在onShow()方法里,可以获取复制到剪切板的内容string,然后用smartAddress处理这个string,如果判断出这个string包含有地址信息或联系人信息,则弹窗询问用户是否将内容粘贴到输入框。

    【用法示例】:

    // 剪切板(复制)的内容,注意,进入页面后会异步请求定位,然后获取到locatedTown。所以必须延时解析复制的地址,否则解析后
            // 再定位到locatedTown,就会默认选定街道办!!
            wx.getClipboardData({
                success: (option) => {
                    let string = option.data
                    console.log("clipboard data==============================" + option.data)
                    if (string && string.length > 1 && string.length < 120) {
                        let result = smartAddress.processAddress(string)
                        let count = result.count
                        // 地址信息超过2部分才自动(弹窗)粘贴,否则让用户自行粘贴(长按输入框粘贴)
                        // 有地址,并且确定是地址,需要解析获取地区、街道
                        let address = result.address
                        if (count > 1 || (address && smartAddress.isAddress(address))) {
                            wx.showModal({
                                title: '检测到地址信息',
                                content: '是否粘贴地址信息?',
                                confirmText: '粘贴',
                                cancelText: '取消',
                                success: function (res) {
                                    if (res.confirm) {
                                        if (result.name) {
                                            _this.setData({"address.linkMan": result.name})
                                        }
                                        if (result.phone) {
                                            _this.setData({"address.phoneNumber": result.phone})
                                        }
                                        _this.handleClipboardAddress(address)
                                        // 清空剪切板
                                        wx.setClipboardData({
                                          data: '',
                                        })
                                    }
                                }
                            })
                        }
                        
                    }
                },
            })
    

    smartAddress.js

    function isString(string) {
        if ((typeof string == 'string') && string.constructor == String) {
            return true
        }
        return false
    }
    
    function numberIndex(address) {
        var n = address.search(/\d/g);
        return n
    }
    
    function letterIndex(address) {
        var n = address.search(/[a-zA-Z]/g);
        return n
    }
    
    // 必须先比对+86的手机号,防止+86被单独分割。在确定没有+86后,才能继续判断是否为手机号码。中间可包含空格
    function x86PhoneIndex(address) {
        var n = address.search(/(\(\s*)?\+86(\s*\))?\s*-?\s*1\d{10}/g);
        return n
    }
    
    function phoneIndex(address) {
        var n = address.search(/1\d{10}/g);
        return n
    }
    
    function telePhoneIndex(address) {
        // 座机正则 无区号, 010 xxxxxxx, 
        var n = address.search(/(\(\s*)?0\d{2,3}\s*\)?\s*-?\s*\d{7,8}/g);
        return n
    }
    
    function phoneEndIndex(address) {
        var n = address.search(/\d{7}\D/g); // 7位数(确定是电话号码的一部分),加非数字结尾(确定电话号码边界)
        // 警告,这里返回的n是末尾段的起始位置!!!而不是结束位置!!
        if (n == -1) {
            return -1
        }
        return n + (7 - 1)
    }
    
    // 可见字符
    function visibleChar(address) {
        var n = address.search(/\S/g);
        return n
    }
    
    // module.exports的方法,里面方便切调用换内部方法
    function testFunc(string) {
        return removeQuotationMarks(string)
    }
    
    // 只要是以下面这些关键词为起始字符的,都认定为地址值。
    function isAddress(address) {
        let items = ["中国",
            "河北", "山西", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "海南", "四川", "贵州", "云南", "陕西", "甘肃", "青海", "台湾",
            "内蒙古", "广西", "西藏", "宁夏", "新疆",
            "北京", "天津", "上海", "重庆",
            "深圳"
        ]
        for (var i = 0; i < items.length; i++) {
            let item = items[i]
            if (address.startsWith(item)) {
                return true
            }
        }
        return false
    }
    
    // 传入一个包含姓名、电话、地址的字符串(可以只包含1样,或2样,或3样),返回一个对象 {name: xx, phone: xx, address: xx},无对应属性则为undefined
    function processAddress(address) {
        let address0 = address
        if (typeof(address0) != 'string') {
            return undefined
        }
        // address0.replace(/(^\s*)|(\s*$)/g, "");        // 去掉前后不可见字符
        address0 = removeQuotationMarks(address0)   
        if (!isString(address0)) {
            return undefined
        }
        if (address0.length < 5 && numberIndex(address0) > -1) { // 长度 < 5,不包含数字,当做姓名
            return {
                name: address0,
                count: 1
            }
        }
        var phoneIndexInString = -1 // 电话号码在(分割后)字符串中的位置
        let array0 = address0.split(",")
        var array1 = []
        for (var i = 0; i < array0.length; i++) {
            let arr = array0[i].split(",") //中文逗号
            array1.push.apply(array1, arr)
        }
        var array2 = []
        for (var i = 0; i < array1.length; i++) {
            let arr = array1[i].split(";")
            array2.push.apply(array2, arr)
        }
        var array3 = []
        for (var i = 0; i < array2.length; i++) {
            let arr = array2[i].split(";") //中文分号
            array3.push.apply(array3, arr)
        }
        var array40 = []
        for(var i = 0; i < array3.length; i++) {
            let arr = array3[i].split(":")
            array40.push.apply(array40, arr)
        }
        var array4 = []
        for(var i = 0; i < array40.length; i++) {
            let arr = array40[i].split(":")
            array4.push.apply(array4, arr)
        }
        var array50 = []
        for (var i = 0; i < array4.length; i++) {
            let arr = array4[i].split("\n")
            array50.push.apply(array50, arr)
        }
        var array51 = []
        for (var i = 0; i < array50.length; i++) {
            let arr = array50[i].split("、")
            array51.push.apply(array51, arr)
        }
        var array5 = []
        for (var i = 0; i < array51.length; i++) {
            let string = array51[i]
            if (visibleChar(string) == -1) {
                continue;   // 没有可见字符,继续下一个
            }
            array5.push(string)
        }
        var array6 = []
        var phoneIndexInArray = -1 // 电话号码在数组中的位置
        for (var i = 0; i < array5.length; i++) {
            // 不能直接用空格切割,因为手机号码 "+86 15888888888" "+86 -15888888888"中间可能有空格!
            let string = array5[i]
            
            phoneIndexInString = x86PhoneIndex(string)
            if (phoneIndexInString == -1) {
                phoneIndexInString = phoneIndex(string)
            }
            if (phoneIndexInString == -1) {
                phoneIndexInString = telePhoneIndex(string)
            }
            if (phoneIndexInString != -1) {
                let phoneEnd = phoneEndIndex(string)
                if (phoneIndexInString != 0) {
                    // 号码前有字符串
                    let preString = string.substring(0, phoneIndexInString)
                    var n = preString.search(/\S/g); // 是否包含可见字符
                    if (n != -1) {
                        let arr = preString.split(" ")
                        array6.push.apply(array6, arr)
                    }
                }
                if (phoneEnd == -1) { // 号码在末尾
                    let phoneStr = string.substring(phoneIndexInString, string.length)
                    phoneIndexInArray = array6.length
                    array6.push(phoneStr)
                } else { // 号码之后还有字符
                    let phoneStr = string.substring(phoneIndexInString, phoneEnd + 1)
                    phoneIndexInArray = array6.length
                    array6.push(phoneStr)
                    let suffixString = string.substring(phoneEnd + 1, string.length)
                    var n = suffixString.search(/\S/g); // 是否包含可见字符
                    if (n != -1) {
                        let arr = suffixString.split(" ")
                        array6.push.apply(array6, arr)
                    }
                }
            } else {
                // 不包含任何形式电话号码
                let arr = string.split(" ")
                array6.push.apply(array6, arr)
            }
        }
        var array61 = []
        for (var i = 0; i < array6.length; i++) {
            let string = array6[i]
            if (visibleChar(string) == -1) {
                continue;   // 没有可见字符,继续下一个
            }
            array61.push(string)
        }
        return processPatrs(array61, phoneIndexInArray)
    }
    
    // 去掉字符串前后的(中\英文)单、双引号
    function removeQuotationMarks(address) {
        let address0 = address
        if (typeof(address0) != 'string') {
            return undefined
        }
        address0 = address0.replace(/(^\s*)|(\s*$)/g, "");        // 去掉前后不可见字符。警告,原字符串不变,返回运算结果。所以要重新赋值。
        let firstChar =  address0.substr(0, 1)
        if (firstChar == "\"" || 
        firstChar == "'" || 
        firstChar == "”") { // 中英文左单,双引号
            address0 = address0.substr(1, address0.length - 1)
        }
        let lastChar = address0.substr(address0.length - 1, 1)
        if (lastChar == "\"" || 
        lastChar == "'" || 
        lastChar == "“") {
            address0 = address0.substr(0, address0.length - 1)
        }
        return address0
    }
    
    // arr:已经按分隔符或空格切割好的碎片;phoneIndexInArray:电话号码在arr中的下标,如果不存在则 =-1
    function processPatrs(arr, phoneIndexInArray) {
        if (arr.length > 0) {
            var result = {}
            // 当只有3部分,且中间部分为电话号码时,如 [part0 , phone , part2],则把part0,part2中较长部分当地址,较短部分当姓名
            if (arr.length == 3 && phoneIndexInArray == 1) {
                var part0 = arr[0]
                var part2 = arr[2]
                result.phone = arr[1]
                if (part0.length <= part2.length) {
                    result.name = part0
                    result.address = part2
                } else {
                    result.name = part2
                    result.address = part0
                }
                result.count = 3
            } else {
                var address = ""
                var count = 0
                for (var i = 0; i < arr.length; i++) {
                    let part = arr[i]
                    if (isAddress(part)) {
                        address = address + part
                    } else if (part.length >= 2 && part.length <= 4 && numberIndex(part) == -1 && letterIndex(part) == -1) {
                        // 姓名不能包含数字,字母
                        result.name = part
                        count++
                    } else if (phoneIndex(part) != -1 || telePhoneIndex(part) != -1) {
                        // 手机或座机
                        result.phone = part
                        count++
                    } else {
                        //
                        address = address + part
                    }
                }
                if (address.length > 1) {
                    result.address = address
                    count++
                }
                result.count = count
            }
            return result
        } else {
            return undefined
        }
    }
    
    // 注意,province必须是【标准】省份、自治区、直辖市【全称】
    function removeProvinceName(address, province) {
        let address0 = address
        if (address0.startsWith("中国")) {
            address0 = address0.substr(2, address0.length - 2)
        }
        // 省份全称
        if (address0.startsWith(province)) {
            // 包含标准省份全称
            address0 = address0.substr(province.length, address0.length - province.length)
            return {
                address: address0,
                result: true
            }
        } else {
            // 可能不是标准的省份全称
            if (province.indexOf("省")) {
                let shortProvince = province.replace("省", "")
                if (address0.startsWith(shortProvince)) {
                    // 包含【非】标准省份全称
                    address0 = address0.substr(shortProvince.length, address0.length - shortProvince.length)
                    return {
                        address: address0,
                        result: true
                    }
                } else {
                    return {
                        address: address0,
                        result: false
                    }
                }
            } else {
                return removeInformalAutonomousRegionName(address)
            }
        }
    }
    
    // 如果存在,则移除自治区、直辖市(不标准、不正确的名称,不含省);返回{address:xxx, result:false},有移除操作,则 result = true,否则false
    function removeInformalAutonomousRegionName(address) {
        // 以下名称有头有尾,且包含常见错误、不规则写法。注意,没有自治区、省后缀的词必须放在有自治区、省后缀的词后面。
        // 否则可能在返回的address里遗留‘自治区’,‘省’字
        let items2 = ["广西自治区", "西藏藏族自治区", "宁夏自治区", "新疆维吾尔自治区", "新疆自治区",
            "内蒙古省", "广西省", "西藏省", "宁夏省", "新疆省",
            "内蒙古", "广西", "西藏", "宁夏", "新疆",
            "北京", "天津", "上海", "重庆"
        ]
        for (var i = 0; i < items2.length; i++) {
            let item = items2[i]
            if (address.startsWith(item)) {
                let address0 = address
                address0 = address0.substr(item.length, address0.length - item.length)
                return {
                    address: address0,
                    result: true
                }
            }
        }
        return {
            address: address0,
            result: false
        }
    }
    
    // address必须是以城市名开头才有效果
    function removeCityName(address, city) {
        let address0 = address
        // 城市全称
        if (address0.startsWith(city)) {
            // 包含标准城市全称
            address0 = address0.substr(city.length, address0.length - city.length)
            return {
                address: address0,
                result: true
            }
        } else {
            // 可能不是标准的城市全称
            if (city.indexOf("市")) {
                let shortCity = city.replace("市", "")
                if (address0.startsWith(shortCity)) {
                    // 包含【非】标准城市全称
                    address0 = address0.substr(shortCity.length, address0.length - shortCity.length)
                    return {
                        address: address0,
                        result: true
                    }
                } 
            }
        }
        return {
            address: address0,
            result: false
        }
    }
    
    // address必须是以城区名开头才有效果
    function removeDistrictName(address, district) {
        let address0 = address
        // 城区全称
        if (address0.startsWith(district)) {
            // 包含标准城区全称
            address0 = address0.substr(district.length, address0.length - district.length)
            return {
                address: address0,
                result: true
            }
        } 
        return {
            address: address0,
            result: false
        }
    }
    
    module.exports = {
        processAddress: processAddress,
        isAddress: isAddress,
        removeProvinceName: removeProvinceName,
        removeCityName: removeCityName,
        removeDistrictName: removeDistrictName,
        testFunc: testFunc
    }
    

    相关文章

      网友评论

          本文标题:小程序、js智能拆分姓名、电话号码、地址信息

          本文链接:https://www.haomeiwen.com/subject/tzofoktx.html