2012-03-02 107 views
2

我需要這個字符串<a class=BC_ANCHOR href="http://www.msn.com" onClick=something target=_blank>MSN</a>地帶變成<a href="http://www.msn.com">MSN</a> - 然而這正則表達式\s+\w+[^href]=\S*\w?在閉幕式>不會停止,而是跑到</a>結束 - 有人可以幫助我得到這個正則表達式停止在關閉>正則表達式剝離HTML標籤內容有條件

謝謝!

+2

該正則表達式在許多方面看起來不正確,例如'[^ href]'意思是「匹配除了h,r,e或f之外的任何其他任何東西的_single_字符」。代碼將運行的上下文是什麼? (因爲如果你正在提取網頁上的元素,那麼有更多的方法去解決它。) – nnnnnn 2012-03-02 02:04:36

+0

'[^ href]'表示除了'h','r','e'或'f'之外的任何字符。它並不意味着不是'href'。這可能會像'((?!href \ b)[az] +)' – 2012-03-02 02:07:59

+1

您可能需要[更漂亮的模式](http://stackoverflow.com/questions/4231382/regular-expression-pattern-not -matching任何地方,在串/ 4234491#4234491)。 – tchrist 2012-03-02 02:12:10

回答

3

通過將\w+[^href]你仍然允許之類的東西<a href ="...,可以排除hre,或f結束標記(即不一定href)。

嘗試

\s+(?!href)[a-zA-Z+]+ *= *(?:"[^"]+"|\w+) 

說明:(?!href)是負先行並防止標籤被href

[a-zA-Z]+是你的標籤。 '='前後有空格。我限於字母,因爲我很確定屬性名稱不能包含數字或下劃線(其中\w將允許)。

(?:"[^"]+"|\w+)表示標記的值可以是雙引號內的任何內容,也可以是未引用的一組\w+

這些都阻止匹配超出>,除非您的正則表達式格式錯誤並且您有(例如)<a name="asdf>(注意缺失的結束")。

+0

很好的解釋。我會投兩次如果我可以:) – 2012-03-02 02:13:37

+0

這是工作真棒 - 除了我剛剛發現的一個場景。有一個鏈接看起來像'MSN',出於某種原因'(事件)'沒有得到匹配。我試着將'\ w +'改成'。*',但是選擇了所有的東西。正則表達式,你爲什麼恨我? – 2012-03-02 02:20:04

+2

正則表達式不恨你,你只需要學習貪婪和非貪婪。 '。*'儘可能匹配(所以會一直到最後一個'>')。爲了使這種非貪婪,即儘可能匹配*小*,請嘗試'。*?'。或者,您可以執行'[\ w()] +'來允許'\ w'和括號。 (請記住,'\ w'是'[a-zA-Z0-9_]'(粗略地說,不確定區域設置和重音字母)。 – 2012-03-02 02:41:59

2

如果你真的想使用正則表達式,我的建議是反過來做。將href和鏈接文本解壓縮到組,然後再次生成標記。

href="([^"]+)"[^>]*>([^<]+)<\/a> 

有人提到使用DOM獲取值,我也同意如果你使用JS是最好的選擇。

+0

由於某種原因,Regex選擇了整個字符串 - 當我需要做的是將所有'A'標籤除了'href'並且呈現該字符串。 – 2012-03-02 02:08:12

3

不要試圖使用正則表達式來消毒HTML。安全後果較差的方式可能會導致錯誤發生。

您的問題可能存在DOM解決方案,如果沒有,那麼有些庫已經由編寫解析器爲生的人進行了全面測試和審查。

無恥插頭:http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer

+0

+1顯然,下來的選民沒有足夠的理由說出他們的答案是好建議 – RobG 2012-03-02 02:16:17

+0

你爲什麼要用JS消毒HTML?爲什麼不如果需要的話,你需要做服務器端嗎? – mpen 2012-03-02 03:11:38

+1

@Mark,如果你從web服務調用中獲得HTML,但不信任該服務在你的域中運行代碼,那麼你必須自己清理它,你可以避免延遲 – 2012-03-02 04:39:37

0

你處理HTML或DOM元素?

更容易處理元素。如果你想要的元素只具有href屬性,那麼爲什麼不喜歡:

function fixLink(el) { 
    var newLink = document.createElement('a'); 
    newLink.href = el.href; 
    newLink.appendChild(document.createTextNode(el.textContent || el.innerText)); 
    el.parentNode.replaceChild(newLink, el); 
} 

即使你正在處理HTML,你可以將其插入一個新的元素(比如一個div),做以上,然後獲取剩餘的innerHTML。

+0

我想探討一下,我解析了評論欄的鏈接,評論最初是以HTML格式顯示給用戶的,但是當用戶想要編輯評論時,我需要將其轉換去文字並去掉一些裝飾我添加特定於應用程序。考慮到這一點,有沒有更好的方式來與DOM做到這一點呢? – 2012-03-02 18:41:32