/** * SmartAddress * @author Tevin */ import { $locations } from '@components/forms/chinaArea/ChinaLocations'; import { Tools } from '@components/common/Tools'; export class SmartAddress { constructor() { this.wordData = {}; } parseWord(word, callback) { if (!this._checkLength(word)) { callback(false); return; } this.wordData = {}; const wordArr = this._splitWord(word); $locations.onReady(() => { this._checkPhone(wordArr); this._checkCompany(wordArr); this._checkUser(wordArr); this._checkAddress(wordArr); if (Tools.isEmptyObject(this.wordData)) { callback(false); } else { callback({ ...this.wordData }); } }); } _checkLength(word) { if (!word || typeof word !== 'string') { return false; } else if (word.length < 8) { return false; } else if (word.length > 150) { return false; } return true; } _splitWord(word) { word = word.replace(/([::]) */g, '$1'); // 带类型名模式预处理 const splitReg = /[ \n\r…,.;?!'"()\[\],。;?!‘’“”()【】—|]/g; const array = word.split(splitReg).filter(Boolean); return array.map(item => { const nextItem = { label: '', content: '' }; if (/[::]/.test(item)) { const [label, content] = item.split(/[::]/g).filter(Boolean); nextItem.label = label; nextItem.content = content; } else { nextItem.content = item; } return nextItem; }); } _checkPhone(list) { const phoneLabelReg = /^电话|联系电话|手机|手机号码$/; const phoneReg = /^1[3456789]\d{9}$/; const telReg = /\d{3.4}-\d{8}/; for (let i = 0, item; (item = list[i]); i++) { if (!item.content) { continue; } if (item.label) { if (phoneLabelReg.test(item.label)) { this.wordData.phone = item.content; if (this.wordData.phone.length === 13) { this.wordData.phone = this.wordData.phone.replace(/-/g, ''); } list.splice(i, 1); break; } } else { const phone = item.content.replace(/-/g, ''); if (phoneReg.test(phone)) { this.wordData.phone = phone; list.splice(i, 1); break; } else if (telReg.test(item.content)) { this.wordData.phone = phone; list.splice(i, 1); break; } } } } _checkCompany(list) { const companyLabelReg = /公司|公司名称|客户|客户名称/; const companyNameReg = /公司|厂|站|气|部$/; for (let i = 0, item; (item = list[i]); i++) { if (!item.content) { continue; } if (item.label) { if (companyLabelReg.test(item.label)) { this.wordData.company = item.content; list.splice(i, 1); break; } } else { if (item.content.length > 5 && companyNameReg.test(item.content)) { this.wordData.company = item.content; list.splice(i, 1); break; } } } } _checkUser(list) { const userLabelReg = /姓名|联系人|收货人|收件人/; const userReg = /^[\u4e00-\u9fa5]{2,3}$/; for (let i = 0, item; (item = list[i]); i++) { if (!item.content) { continue; } if (item.label) { if (userLabelReg.test(item.label)) { this.wordData.user = item.content; list.splice(i, 1); break; } } else { if (userReg.test(item.content)) { this.wordData.user = item.content; list.splice(i, 1); break; } } } } _checkAddress(list) { const adrLabelReg = /地址|详细地址|公司地址|联系地址|地区|所在地区/; for (let i = 0, item; (item = list[i]); i++) { if (!item.content) { continue; } if (item.label) { if (adrLabelReg.test(item.label)) { this._parseAddress(item.content); list.splice(i, 1); break; } } else { if (this._isAddress(item.content)) { this._parseAddress(item.content); list.splice(i, 1); break; } } } } _isAddress(content) { content = content.replace('中国', ''); const provinceNames = $locations.getLocationTree() .map(lv1 => lv1.label.replace('特别行政区', '').replace('省', '')); for (let province of provinceNames) { if (content.indexOf(province) >= 0) { return true; } } return false; } _parseAddress(content) { content = content.replace('中国', ''); const chinaTree = $locations.getLocationTree(); // 省份处理 --- const provinceTailReg = /特别行政区|自治区|省|市$/; for (let province of chinaTree) { const provinceStr = province.label.replace(provinceTailReg, ''); // 省份匹配 if (content.indexOf(provinceStr) === 0) { // 保存省 this.wordData.province = province.label; this.wordData.provinceCode = province.value; // 移除省份 const provinceNameReg = new RegExp('^' + provinceStr + '(特别行政区|自治区|省|市)?'); content = content.replace(provinceNameReg, ''); // 市级处理 --- const cityTailReg = /市|区|县|自治县|自治州|地区$/; for (let city of province.children) { const cityStr = city.label.replace(cityTailReg, ''); // 市级匹配 if (content.indexOf(cityStr) === 0) { // 保存市级 this.wordData.city = city.label; this.wordData.cityCode = city.value; // 移除市级 const cityNameReg = new RegExp('^' + cityStr + '(市|区|县|自治县|自治州|地区)?'); content = content.replace(cityNameReg, ''); // 区级处理 --- const distTailReg = /市|区|县|镇|乡|自治县|开发区|新区|矿区|旗|自治旗$/; for (let dist of city.children) { const distStr = dist.label.replace(distTailReg, ''); // 区级匹配 if (content.indexOf(distStr) === 0) { // 保存区级 this.wordData.dist = dist.label; this.wordData.distCode = dist.value; // 移除区级 const distNameReg = new RegExp('^' + distStr + '(市|区|县|镇|乡|自治县|开发区|新区|矿区|旗|自治旗)?'); content = content.replace(distNameReg, ''); } } } } } } // 省市区都匹配上了,剩下的为街道 if (this.wordData.province && this.wordData.city && this.wordData.dist) { this.wordData.street = content; } } }