2017-09-20 131 views
0

我有一個字符串是這樣的:解析HTML內容的JavaScript/lodash

var inputString = "some sample string with <span data-id='24' data-name='cat'">cat</span> and <span data-id='25' data-name='dog'">dog</span>" 

我試圖做的是從跨度的數據提取到一個JSON數組:

var json = [ 
    { 
     id: '24', 
     name: 'cat' 
    }, 
    { 
     id:'25', 
     name: 'dog' 
    } 
]; 

,然後又脫掉字符串中的跨度:

var outputString = "some sample string with cat and dog"; 

我如何能做到這一點使用普通的Java任何想法腳本還是lodash?是否有將提取所有爲我跨度段,或做我需要做一步一步來,發現從第一個開始span元素的索引中的作用?任何幫助,將不勝感激。

+3

指定的字符串的文件片段的'innerHTML',然後使用DOM函數來提取元素。 – Barmar

回答

2

你會解析字符串作爲HTML,提取數據的屬性,並使用textContent來獲取文本

var inputString = "some sample string with <span data-id='24' data-name='cat'>cat</span> and <span data-id='25' data-name='dog'>dog</span>"; 
 

 
var parser = new DOMParser(); 
 
var doc = parser.parseFromString(inputString, "text/html"); 
 
var json = [].slice.call(doc.querySelectorAll('span')).map(function(span) { 
 
    return {id : span.dataset.id, name : span.dataset.name}; 
 
}); 
 

 
var outputString = doc.body.textContent; 
 

 
console.log(json); 
 
console.log('------'); 
 
console.log(outputString);
.as-console-wrapper {max-height: 100%!important; top: 0;}

+0

這太棒了!你知道,如果有找詞(如狗或貓)的開始和結束索引一個簡單的方法?狗出現的位置以及貓出現在字符串中的位置(忽略跨度)。 – Prabhu

+0

當然,當你有,你可以用字符串'indexOf'得到字符串中的字的索引 – adeneo

+0

嗯確定...我只是想知道我怎麼可能只適用於跨度的話得到指標雖然.. 。如果在字符串的其他地方還有另一隻狗...... – Prabhu

1

對方回答是偉大的,肯定回答了這個問題,但我想提供一個利用正則表達式的替代答案。我不是最好的正則表達式,但是這是我想出了...

const input = "some sample string with <span data-id='24' data-name='cat'>cat</span> and <span data-id='25' data-name='dog'>dog</span>"; 

const dataReg = new RegExp(/data-(\w+)=[\'|\"](\w+)[\'|\"] data-(\w+)=[\'|\"](\w+)[\'+\"]/g); 

const json = []; 

// get the matches and add them to the json array 
while ((g = dataReg.exec(input)) !== null) { 
    // we only care about matches after idx 1 
    let m = {}; 
    m[g[1]] = g[2]; 
    m[g[3]] = g[4]; 
    json.push(m); 
} 

console.log(json); // [{id: "24", name: "cat"}, {id: "25", name: "dog"}] 

// strip the html 
let safeStr = input.replace(/<(?:.|\n)*?>/gm, ''); 

console.log(safeStr); // some sample string with cat and dog" 

你可以在這裏先睹爲快吧:https://jsbin.com/quyufoc/edit?js,console

+0

這也很棒。使用這種方法,如果我想也覺得每個字(狗和貓)在輸出字符串的開始和結束索引,我怎麼能這樣做呢? – Prabhu

+0

我知道我可以使用indexOf函數,但如果句子中的其他狗和貓沒有包裹在span中,它可能會讓我失望。 – Prabhu

+1

你希望他們在safeStr指數?並且你的第二條評論肯定會引發一個潛在的問題......我想你想要標記中出現的狗和貓的索引,但包括在它出現之前刪除的字符的偏移量? – kyle