2010-07-17 105 views
2

我GOOGLE了一些代碼,使用設置高亮的代碼是一個URL轉換爲超鏈接:正則表達式轉換鏈接的超鏈接

// format the url tags: [url=www.website.com]my site[/url] 
// becomes: <a href="www.website.com">my site</a> 
exp = new Regex(@"\[url\=([^\]]+)\]([^\]]+)\[/url\]"); 
str = exp.Replace(str, "<a href=\"$1\">$2</a>"); 

// format the img tags: [img]www.website.com/img/image.jpeg[/img] 
// becomes: <img src="www.website.com/img/image.jpeg" /> 
exp = new Regex(@"\[img\]([^\]]+)\[/img\]"); 
str = exp.Replace(str, "$1\" />"); 

我也想轉換普通鏈接hyperlinks.I've一派更多一些並得到了這個:

exp = new Regex("(http://[^ ]+)"); 
str = exp.Replace(str, "<a href=\"$1\">$1</a>"); 

問題是,當我混合他們和第三個正則表達式執行時,前兩個會搞砸。因爲它可能導致:

<img src="<a href='www.website.com/img/image.jpeg>www.website.com/img/image.jpeg</a>" /> 

如何我在第三的正則表達式,他無法轉換與「HREF =「」或「SRC =」」開頭的字符串指定?

+0

可能重複的[如何從bbcode url標記中提取url +參數?](http://stackoverflow.com/questions/3257607/how-to-extract-the-urlparameters-out-of-a -bbcode-url-tag) – kennytm 2010-07-17 12:53:27

回答

1

鑑於用戶可能會向您發送有趣的標籤組合,正則表達式很快會變得繁瑣且難以用於解析標籤。

BBCode本質上是一種語法,編程解釋語法的最好方法是使用實​​際的解析器。

看看http://bbcode.codeplex.com/。我不能保證它的有效性,但是他們已經在C#中爲BBCode實現了一個解析器,它可以做你正在尋找的東西。

+2

基本的正則表達式也沒有足夠的業務邏輯來保護你免受狡猾的用戶侵害。用戶可以很容易地使用[url] javascript:window.alert(「lolol」)[/ url]或[img] http://path.to/a/script.php [/ img]來做些事情,並造成各種破壞。 – Chris 2010-07-17 13:10:05