2017-08-26 47 views
1

我需要解析看起來像多個電子郵件正文:高效解析電子郵件正文中的JavaScript

Name: Bob smith 
Email: [email protected] 
Phone Number: 4243331212 

作爲一個更大的計劃,我有以下函數來解析頁面的一部分:

function parseBody(i, body) { 

result = [] 
result[0] = i 

var name = body.match(new RegExp(/\*Name:\*(.*) /)) 
if (name) { 
    result[1] = name[1] 
} 

...... 

    return result; 

} 

而不是有可能10個字段解析並通過if語句加載到結果數組中,是否有更高效的方式使用JavaScript來解析此頁面並加載數組?

+0

我沒有看到你所說的 「10場」 是什麼意思?你給的例子只有3個。 – Bergi

+0

只需分割成幾行,然後在每一個冒號後面加上一部分? – Bergi

回答

1

我會建議找到一種方法來分割身體並確定鍵和值來構建結果對象。

  • 爲了拆分體,您可以使用正則表達式匹配一個關鍵的結構:

    let delimiter = new RegExp('(\w*): ') 
    
  • 然後在正文中使用的分割方法與此正則表達式得到一個陣列與鍵和值的alternance:

    let split = body.split(delimiter) 
    
  • 最後從這些值中的鍵與環進行排序:

    let res = {} 
    for(let i = 0; i < split.length; i += 2) 
        res[ split[i] ] = split[ i+1 ] // even indexes are key, odd ones are values 
    

推進,你可以刪除空鍵和結尾的空格和回車用更先進的正則表達式。這裏是一個可能的實現:

function parseBody (body) { 
     let split = body 
     .split(new RegExp('(\w*): ([^\t\r\n]*)[\t\r\n]*')) // removes trailing line feed 
     .filter(x=>x) // remove empty matches 
     let res = {} 
     for(let i = 0; i < split.length; i += 2) 
     res[ split[i] ] = split[ i+1 ] // even indexes are key, odd ones are values 
     return res 
    } 

這將返回一個關聯數組,但你有這個想法,如果你想要一個簡單的數組。

+0

謝謝,一個非常有趣的想法。我收到一條錯誤消息:「在發表聲明前缺少。」在「let split = body」行 – user61629

+0

我沒有收到任何錯誤,您使用的是解釋器還是linter? –

+0

我正在使用谷歌應用程序腳本。 – user61629

1

句柄數和不確定

var mailBody = ` 
 
Name: Bob smith 
 
Email: [email protected] 
 
Phone Number: 4243331212 
 
key4:value4 
 
key5:value 5 
 
key6: 
 
    key7: value7 
 
`; 
 

 
var obj = {}; 
 
mailBody.split('\n').forEach(v=>v.replace(/\s*(.*)\s*:\s*(.*)\s*/, (s,key,val)=>{ 
 
    obj[key]=isNaN(val)||val.length<1?val||undefined:Number(val); 
 
})); 
 

 
console.log(obj);