2016-11-26 54 views
-1

我想確認如果輸入的代碼是HTML代碼(有必要先從<html></html>結束)正則表達式的HTML標記的JavaScript

我嘗試這樣做

var reghtml = new RegExp("(<html>*\n+</html>)");

但是我有一個問題是需要使\ n的代碼,我需要驗證所述第一和結束標記(= <html></html>)如果他在他們之間做了一些事情,則需要以<開頭並以>結尾

有沒有解決方法?

+1

對不起,*如果他讓他們之間的事情就必須啓動用'<'結尾,用'>'*結尾是相當不清楚的。 –

+0

@WiktorStribiżew如果他作出這樣''它是正確的,但如果他想使標籤之間的事情,他需要開始用'<'和結束'>',例如'測試'=>錯誤| ''=>正確 – saadsaad

+1

類似'/^(?:\ s * <[^> *))* <\/html> $ /。test(your_html)'? –

回答

1

這裏給你一個模式。它會檢查第一級是否有有效的開始和結束標記。第一個級別必須有結束標記,您不能執行<html><img /></html>,因爲您可以刪除整個結束標記檢查模式部分。

var validHtml = '\ 
 
<html itemscope>\ 
 
\t <head></head>\ 
 
\t <body style="background: red;">\ 
 
\t \t Everything is fine\ 
 
\t </body>\ 
 
</html>\ 
 
', 
 
\t invalidHtml = '\ 
 
<html itemscope>\ 
 
\t <head></foot>\ 
 
\t <body>\ 
 
\t \t Nothing is fine\ 
 
\t </body>\ 
 
</html>\ 
 
', 
 
\t pattern = /^\s*<html(?:\s[^>]*)?>(?:\s*<(\w+)(?:\s[^>]+)?>(?:.|\s)*<\/\1>\s*)*<\/html>\s*$/i; 
 
\t 
 
console.log(pattern.test(validHtml) ? 'valid' : 'invalid'); 
 
console.log(pattern.test(invalidHtml) ? 'valid' : 'invalid');

1

你不應該使用正則表達式來驗證HTML(更不用說解析它),因爲HTML是不是 「Regular Language」。

所以這裏的,這將導致任何正則表達式假陰性情況的一個例子,你可以寫嘗試驗證HTML標記爲無效:

<html> 
<head> 
    <!-- </html> --> 
</head> 
<body> 
    <p>This is valid HTML</p> 
</body> 
</html> 

而且因爲你可以在HTML嵌套評論(和SGML和XML),你不能寫一個簡單的正則表達式這種特殊的情況下,或者:

<html> 
<head> 
    <!-- <!-- <!-- <!-- </html> --> 
</head> 
<body> 
    <p>This is valid HTML</p> 
</body> 
</html> 

而且這裏有一個假陽性(假設你沒有使用正則表達式^$主播):

<p>illegal element</p> 
<html> 
    <img>illegal text node</img> 
</html> 
<p>another illegal element</p> 

當然,還有更強大的正則表達式實現,它們爲計算深度之類的東西增加了rudiminary支持,但是接下來您將處於一個受到傷害的世界。

驗證HTML的正確方法是使用HTML DOM庫。在.NET中,這是HtmlAgilityPack。在基於瀏覽器的JavaScript這是更簡單:只需要​​使用瀏覽器內置的解析器(innerHTML):

(從Check if HTML snippet is valid with Javascript被盜)

function isValidHtml(html) { 
    var doc = document.implementation.createHTMLDocuiment(""); 
    doc.documentElement.innerHTML = html; 
    return (doc.documentElement.innerHTML === html); 
}