2017-02-17 71 views
1

我想分析一些html代碼並將其分解爲一組對象。將一些html代碼拆分爲對象數組

下面是一些例子的html代碼:

<slide data-time=5> 
    <div class="cds-block-title">Master Calendar</div> 
    <div class="cds-block-content">iframe to master calendar</div> 
</slide> 

<slide data-time=5> 
    <div class="cds-block-title">Weather</div> 
    <div class="cds-block-content">iframe to master Weather App</div> 
</slide> 

我的目標是把它分解成類似這樣的對象:

[ 
    { 
     "html":"<slide.....</slide>", 
     "time":"5", 
     "title":"Master Calendar", 
     "content":"iframe...." 
    }, 
    { 
     "html":"<slide.....</slide>", 
     "time":"5", 
     "title":"Master Calendar", 
     "content":"iframe...." 
    } 
] 

我已經嘗試了幾種不同的方法。 使用正則表達式(這工作在我的測試,但不是當我把它放在生產,.match停止工作如預期,我也讀了幾篇文章說,使用正則表達式來解析HTML代碼是不是最好的辦法):

function splitSlidesHtml(html){ 
var html = '<slide data-time="5"><div class="cds-block-title">Activities & Sports</div><div class="cds-block-content">content</div></slide><slide data-time="5"><div class="cds-block-title">weather</div><div class="cds-block-content">content</div></slide>"'; 
    var slides = html.match(/<slide.*?>(.*?)<\/slide>/g); 
    var slidesA = []; 
    if (!slides) { 
    slidesA.push({"html":html}); 
    } else { 
    for (i in slides){ 
     var c = {}; 
     c.html = slides[i]; 
     c.time = slides[i].match(/(data-time=)(.*?)>/)[2].replace(/['"]+/g, ''); // extract the time, and replace any quotes that might be around it 
     c.title = slides[i].match(/<div class="cds-block-title">(.*?)<\/div>/)[1]; 
     c.content = slides[i].match(/<div class="cds-block-content">(.*?)<\/div>/)[1]; 
     slidesA.push(c); 
    } 
    } 
    return slidesA; 
} // end splitSlidesHtml 

我也嘗試過使用jQuery,這種類型的工作,但我不知道parseHTML知道如何確保它在不同的幻燈片中打破。

var slides = $.parseHTML(html); 
console.log(slides); 
console.log(slides[0].innerHTML); 
console.log(slides[0].outerHTML); 
+2

首先,[不要使用正則表達式](http://stackoverflow.com/a/1732454/1810460)。其次,如果你的HTML由於某種原因在字符串中而不是在DOM中,你只想使用'parseHTML'。如果是這樣的話,你應該可以做一些像'slides.children('slide')。each(function(slide){})'以便能夠與每張幻燈片分別進行交互 – Hamms

+0

當我parseHTML只是獲取第一級?因此,對於我的示例,我將不得不parseHTML將其分解爲幻燈片,然後再爲每個幻燈片分析parseHTML,以查找標題和內容。 –

+0

根本不需要,您只需查看幻燈片[[innerHTML]](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML)以外的內容即可無用地將你的['Elements'](https://developer.mozilla.org/en-US/docs/Web/API/Element)轉換爲字符串。例如,您可以查看['(幻燈片).children(「.cds-block-title」)](https://api.jquery.com/children/)以獲得標題'div',然後調用['.text()'](http://api.jquery.com/text/)來獲得內容 – Hamms

回答

0

這是我終於想出了。我在地圖工作中遇到了麻煩,無法正確地獲取時間。

var html = sheetData['values'][prop]['html'];   
var parsed = $.parseHTML(html); 
var isSlide = true; 
for (n in parsed){ 
    var cur = parsed[n]; 
    if (cur.nodeName == "SLIDE"){ 
    var curSlide = { 
     html: cur.outerHTML, // store the HTML 
     time: cur.dataset.time, // store the data-time attribute 
     title: $('.cds-block-title', cur).html(), // store the title 
     content: $('.cds-block-content', cur).html(), // store the content 
    }; 
    } else { 
    isSlide = false; 
    } 
} 
2

您可以使用$.parseHTML()你的HTML字符串循環轉換成DOM節點的數組,然後通過節點搶你所需要的信息。在這種情況下,當您將每個節點映射到其他節點時,.map()是一個很好的用法。

var html = '<slide data-time=5>\ 
 
    <div class="cds-block-title">Master Calendar</div>\ 
 
    <div class="cds-block-content">iframe to master calendar</div>\ 
 
</slide>\ 
 
<slide data-time=5>\ 
 
    <div class="cds-block-title">Weather</div>\ 
 
    <div class="cds-block-content">iframe to master Weather App</div>\ 
 
</slide>'; 
 

 
var slides = $($.parseHTML(html)).map(function() { 
 
    return { 
 
     // store the HTML 
 
     html: this.outerHTML, 
 
     // store the data-time attribute 
 
     time: this.dataset.time, 
 
     // store the title 
 
     title: $('.cds-block-title', this).text(), 
 
     // store the content 
 
     content: $('.cds-block-content', this).text(), 
 
    }; 
 
}).get(); 
 

 
console.log(slides);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

+0

這會有很大的幫助。當我解析出我的html時,它將它分解爲幻燈片,文本,幻燈片,文本。我如何強制它在地圖上看幻燈片? –

+0

每張幻燈片後,你如何獲得文字?這將意味着您在示例中提供的HTML字符串不準確。也許你可以在'.map()'調用之前使用[.filter()](http://api.jquery.com/filter/)。 – Mikey