2010-11-03 87 views
4

我需要一個正則表達式來允許除HTML標記以外的任何其他內容。這裏的訣竅是<和>字符將允許,但只是不與他們之間的文本(但其他字符都可以)。正則表達式禁止HTML標記?

以下被允許:

hello world 
[email protected]$%^&*()_+'":;[]{}()\|# 
<<<<<<< 
>>>>> 
<> 
>< 
<087> 
<--> 

以下不會被允許

<html> 
<a> 
<foo> 
<bar> 

我已經試過,沒有運氣幾個表情。事實證明,這是比它似乎出奇難先(我反正:P)

編輯:基本上,什麼是允許不同的是:A-Za-z<>字符之間。

+7

。‘令人驚訝的難度比它似乎在第一次’ - 這是有原因的,請參閱[RegEx匹配開放標籤,但XHTML自包含標籤](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contained-tags) – 2010-11-03 22:20:58

+1

什麼語言?如果使用PHP,我會比較你的字符串和strip_tags(your_string)。最難的部分是不寫正則表達式,它寫下每一個可能的標籤 – 2010-11-03 22:22:53

回答

10

如果你這樣做是爲了防止在網站上注入HTML,那麼一個更好的解決方案就是在HTML特殊字符發送到瀏覽器之前轉義它。大多數Web開發環境/庫將具有標準功能來執行此操作,例如PHP具有htmlentitieshtmlspecialchars函數。

+0

+1我必須同意正確的逃避比試圖刪除危險文本好。 – 2010-11-03 22:34:50

+0

是的。試圖刪除「危險的「東西是錯誤的方法。如果您以後需要將用戶輸入存儲在SQL數據庫中,您是否還會嘗試刪除引號?逃避是要走的路。 – 2010-11-03 23:20:12

+1

我沒有這樣做來防止注入,我這樣做是因爲我們調用的web服務不允許(出於某種原因)兩個尖括號之間的文本。 – 2010-11-03 23:38:45

1

令人震驚的是,因爲你描述你的使用情況,它實際上聽起來像使用regexen將在這裏工作:你需要防止<SomeTextHere>從顯示出來,而不在哪裏,當然也沒有必要擔心遞歸任何限制。以下正則表達式與您想要的相反:<[A-Za-z]+>(如果不允許<>,則將+更改爲*)。這比比皆是這樣的文字發生;我建議用邏輯代替語言(,例如,if (!/<[A-Za-z]+>/) { do_something() })。如果你在正則表達式中需要它,並且如果你的語言支持這樣的事情,你可以使用負面的預見性斷言:^(?!.*<[A-Za-z]+>)。這是說「比賽在字符串(^)的開始。如果我不能查找((?!...))給定的文本,但您的匹配字符串將不包含任何字符