2017-05-08 56 views
1

我有一個樣品多行字符串凡在我得讓他們之間的所有div標籤和內容,其中在p標籤不等於一個特定ID的Javascript [ S S *是太貪婪

var str="<div> 
     <p id=\"a\">Sample sentence</p> 
     </div> 

     <div> 
     <p id=\"b\">Sample sentence 2</p> 
     </div>" 

我使用的正則表達式太貪婪,我只需要匹配第二個div標籤及其內容,但它也從上面捕獲div標籤。這裏是我的正則表達式:

<div>[\s\S]*<p id="b">[\s\S]*<\/div> 

,因爲我用它捕獲整個字符串,但我只是想捕捉的正則表達式:

<div> 
    <p id="b">Sample sentence 2</p> 
</div> 

任何正則表達式大師在那裏,可以幫助我嗎?

+3

使用DOM解析器,如果你是內瀏覽器/ node.js的,例如這是微不足道的http://stackoverflow.com/questions/10585029/parse-a-html-string-with-js&在這裏很多其他的例子。 –

+3

正則表達式大師會建議您不要嘗試使用正則表達式解析/分析/操作DOM。例如,理論上不可能編寫一個在存在嵌套div的情況下表現正確的正則表達式。 – 2017-05-08 18:04:31

+0

標籤可以用正則表達式解析。然而,標籤之間的開放/關閉或缺乏以及結構關係並不是正則表達式的優點。 – sln

回答

1

許多人會建議:don't use正則表達式來解釋/解析/提取HTML。而是使用DOM的功能。例如:

var str=` 
 
<div> 
 
    <p id="a">Sample sentence</p> 
 
</div> 
 

 
<div> 
 
    <p id="b">Sample sentence 2</p> 
 
</div>`; 
 

 
var elem = document.createElement('span'); 
 
elem.innerHTML = str; 
 
elem = elem.querySelector('div:nth-child(2)'); 
 
console.log(elem.outerHTML);

1

你可以嘗試/<div>\n.*<p id=\\"b\\">.*\n.*<\/div>/g如果你在這種情況下,使用正則表達式。不過,如果可以的話,我會建議你使用DOM解析器。

const regex = /<div>\n.*<p id=\\"b\\">.*\n.*<\/div>/g; 
 
const str = `<div> 
 
     <p id=\\"a\\">Sample sentence</p> 
 
     </div> 
 

 
     <div> 
 
\t \t \t <p id=\\"b\\">Sample sentence 2</p> 
 
     </div>`; 
 
let m; 
 

 
while ((m = regex.exec(str)) !== null) { 
 
    // This is necessary to avoid infinite loops with zero-width matches 
 
    if (m.index === regex.lastIndex) { 
 
     regex.lastIndex++; 
 
    } 
 
    
 
    // The result can be accessed through the `m`-variable. 
 
    m.forEach((match, groupIndex) => { 
 
     console.log(`Found match, group ${groupIndex}: ${match}`); 
 
    }); 
 
}