解析得到的代码能通过XHTML1.0STRICT验证;
包含了标题,链接,字体,对齐,图片,引用,列表等方面的功能.
Ubb.ReadMe.htm
<div id="ubb"> <h1>UBB代码说明</h1> <h2>标题</h2> <dl> <dt>[h1]标题一[/h1]</dt> <dd><h1>标题一</h1></dd> <dt>[h2]标题二[/h2]</dt> <dd><h2>标题二</h2></dd> <dt>[h1]标题三[/h1]</dt> <dd><h3>标题三</h3></dd> <dt>[h4]标题四[/h4]</dt> <dd><h4>标题四</h4></dd> <dt>[h5]标题五[/h5]</dt> <dd><h5>标题五</h5></dd> <dt>[h6]标题六[/h6]</dt> <dd><h6>标题六</h6></dd> </dl> <h2>链接</h2> <dl> <dt>[url]www.unibetter.com[/url]</dt> <dd><a rel="nofollow" href="http://www.unibetter.com">unibetter.com</a></dd> <dt>[url]http://www.unibetter.com[/url]</dt> <dd><a rel="nofollow" href="http://www.unibetter.com">http://www.unibetter.com</a></dd> <dt>[url=http://www.unibetter.com]unibetter大学生论坛[/url]</dt> <dd><a rel="nofollow" href="http://www.unibetter.com" <dt>[email]none@none.com[/email]</dt> <dd><a href="mailto:none@none.com">none@none.com</a></dd> </dl> <h2>字体大小</h2> <dl> <dt>[size=xx-small]文字大小[/size]</dt> <dd><span style="font-size:xx-small">文字大小</span></dd> <dt>[size=x-small]文字大小[/size]</dt> <dd><span style="font-size:x-small">文字大小</span></dd> <dt>[size=small]文字大小[/size]</dt> <dd><span style="font-size:small">文字大小</span></dd> <dt>[size=medium]文字大小[/size]</dt> <dd><span style="font-size:medium">文字大小</span></dd> <dt>[size=large]文字大小[/size]</dt> <dd><span style="font-size:large">文字大小</span></dd> <dt>[size=x-large]文字大小[/size]</dt> <dd><span style="font-size:x-large">文字大小</span></dd> <dt>[size=xx-large]文字大小[/size]</dt> <dd><span style="font-size:xx-large">文字大小</span></dd> </dl> <h2>字体格式</h2> <dl> <dt>[font=黑体]文字字体[/font]</dt> <dd><span style="font-family:黑体">文字字体</span></dd> <dt>[color=red]文字颜色[/color]</dt> <dd><span style="color:red">文字颜色</span></dd> <dt>[color=#0000ff]文字颜色[/color]</dt> <dd><span style="color:#0000ff">文字颜色</span></dd> <dt>[b]粗体字[/b]</dt> <dd><strong>粗体字</strong></dd> <dt>[i]斜体字[/i]</dt> <dd><i>斜体字</i></dd> <dt>[u]下划线[/u]</dt> <dd><span style="text-decoration:underline">下划线</span></dd> </dl> </div> <h2>对齐</h2> <dl> <dt>[left]左对齐[/left]</dt> <dd><div style="text-align:left">左对齐</div></dd> <dt>[right]右对齐[/right]</dt> <dd><div style="text-align:right">右对齐</div></dd> <dt>[center]右对齐[/center]</dt> <dd><div style="text-align:center">居中</div></dd> </dl> <h2>图片</h2> <dl> <dt>[hr]</dt> <dd><hr /></dd> <dt>[img]http://www.w3.org/Icons/valid-xhtml10[/img]</dt> <dd><img src="http://www.w3.org/Icons/valid-xhtml10" <dt>[img=176x62]http://www.w3.org/Icons/valid-xhtml10[/img]</dt> <dd><img src="http://www.w3.org/Icons/valid-xhtml10" style="width:176px;height:62px" </dl> <h2>引用</h2> <dl> <dt>[quote]毛主席他老人家说:一切反动派都是纸老虎![/quote]</dt> <dd><blockquote><div>毛主席他老人家说:一切反动派都是纸老虎!</div></blockquote></dd> </dl> <h2>列表</h2> <h3>无序列表</h3> <p>[list][*]苹果[*]香蕉[*]桃[/list]</p> <ul><li>苹果</li><li>香蕉</li><li>桃</li></ul> <h3>有序列表</h3> <p>[list=1][*]打开冰箱门[*]把大象赶进冰箱[*]关上冰箱门[/list]</p> <ol style="list-style:decimal;"><li>打开冰箱门</li><li>把大象赶进冰箱</li><li>关上冰箱门</li></ol> <p>[list=i][*]打开冰箱门[*]把大象赶进冰箱[*]关上冰箱门[/list]</p> <ol style="list-style:lower-roman;"><li>打开冰箱门</li><li>把大象赶进冰箱</li><li>关上冰箱门</li></ol> <p>[list=I][*]打开冰箱门[*]把大象赶进冰箱[*]关上冰箱门[/list]</p> <ol style="list-style:upper-roman;"><li>打开冰箱门</li><li>把大象赶进冰箱</li><li>关上冰箱门</li></ol> <p>[list=a][*]打开冰箱门[*]把大象赶进冰箱[*]关上冰箱门[/list]</p> <ol style="list-style:lower-alpha;"><li>打开冰箱门</li><li>把大象赶进冰箱</li><li>关上冰箱门</li></ol> <p>[list=A][*]打开冰箱门[*]把大象赶进冰箱[*]关上冰箱门[/list]</p> <ol style="list-style:upper-alpha;"><li>打开冰箱门</li><li>把大象赶进冰箱</li><li>关上冰箱门</li></ol> </div>
复制代码 代码如下:
//作者:deerchao
//http://www.unibetter.com/blogs/blogdeerchao/default.aspx
//在不移除以上(及本条)注释的前提下,任何人可以以任何方式使用此代码.
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web;
usingSystem.Text.RegularExpressions;
namespaceDeerchao.Web
{
publicclassUbbDecoder
{
privatestaticreadonlyRegexOptionsoptions=RegexOptions.Compiled|RegexOptions.Singleline;
///<summary>
///解析Ubb代码为Html代码
///</summary>
///<paramname="ubb">Ubb代码</param>
///<returns>解析得到的Html代码</returns>
publicstaticstringDecode(stringubb)
{
if(string.IsNullOrEmpty(ubb))
returnnull;
stringresult=ubb;
result=HttpUtility.HtmlEncode(result);
result=DecodeStyle(result);
result=DecodeFont(result);
result=DecodeColor(result);
result=DecodeImage(result);
result=DecodeLinks(result);
result=DecodeQuote(result);
result=DecodeAlign(result);
result=DecodeList(result);
result=DecodeHeading(result);
result=DecodeBlank(result);
returnresult;
}
///<summary>
///解析Ubb代码为Html代码,所有的链接为rel="nofollow"
///</summary>
///<paramname="ubb">Ubb代码</param>
///<returns>解析得到的Html代码</returns>
publicstaticstringDecodeNoFollow(stringubb)
{
if(string.IsNullOrEmpty(ubb))
returnnull;
stringresult=ubb;
result=HttpUtility.HtmlEncode(result);
result=DecodeStyle(result);
result=DecodeFont(result);
result=DecodeColor(result);
result=DecodeImage(result);
result=DecodeLinksNoFollow(result);
result=DecodeQuote(result);
result=DecodeAlign(result);
result=DecodeList(result);
result=DecodeHeading(result);
result=DecodeBlank(result);
returnresult;
}
privatestaticstringDecodeHeading(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[h(\d)\](.*?)\[/h\1\]","<h$1>$2</h$1>",options);
returnresult;
}
privatestaticstringDecodeList(stringubb)
{
stringsListFormat="<olstyle=\"list-style:{0};\">$1</ol>";
stringresult=ubb;
//Lists
result=Regex.Replace(result,@"\[\*\]([^\[]*)","<li>$1</li>",options);
result=Regex.Replace(result,@"\[list\]\s*(.*?)\[/list\]","<ul>$1</ul>",options);
result=Regex.Replace(result,@"\[list=1\]\s*(.*?)\[/list\]",string.Format(sListFormat,"decimal"),options);
result=Regex.Replace(result,@"\[list=i\]\s*(.*?)\[/list\]",string.Format(sListFormat,"lower-roman"),options);
result=Regex.Replace(result,@"\[list=I\]\s*(.*?)\[/list\]",string.Format(sListFormat,"upper-roman"),options);
result=Regex.Replace(result,@"\[list=a\]\s*(.*?)\[/list\]",string.Format(sListFormat,"lower-alpha"),options);
result=Regex.Replace(result,@"\[list=A\]\s*(.*?)\[/list\]",string.Format(sListFormat,"upper-alpha"),options);
returnresult;
}
privatestaticstringDecodeBlank(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"(?<=)|(?=)"," ",options);
result=Regex.Replace(result,@"\r\n","<br/>");
string[]blockTags={"h[1-6]","li","list","div","p","ul"};
//clearbrbeforeblocktags(startorend)
foreach(stringtaginblockTags)
{
Regexr=newRegex("<br/>(<"+tag+")",options);
result=r.Replace(result,"$1");
r=newRegex("<br/>(</"+tag+")",options);
result=r.Replace(result,"$1");
}
returnresult;
}
privatestaticstringDecodeAlign(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[left\](.*?)\[/left\]","<divstyle=\"text-align:left\">$1</div>",options);
result=Regex.Replace(result,@"\[right\](.*?)\[/right\]","<divstyle=\"text-align:right\">$1</div>",options);
result=Regex.Replace(result,@"\[center\](.*?)\[/center\]","<divstyle=\"text-align:center\">$1</div>",options);
returnresult;
}
privatestaticstringDecodeQuote(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[quote\]","<blockquote><div>",options);
result=Regex.Replace(result,@"\[/quote\]","</div></blockquote>",options);
returnresult;
}
privatestaticstringDecodeFont(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[size=([-\w]+)\](.*?)\[/size\]","<spanstyle=\"font-size:$1\">$2</span>",options);
result=Regex.Replace(result,@"\[font=(.*?)\](.*?)\[/font\]","<spanstyle=\"font-family:$1\">$2</span>",options);
returnresult;
}
privatestaticstringDecodeLinks(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[url\]www\.(.*?)\[/url\]","<ahref=\"http://www.$1\">$1</a>",options);
result=Regex.Replace(result,@"\[url\](.*?)\[/url\]","<ahref=\"$1\">$1</a>",options);
result=Regex.Replace(result,@"\[url=(.*?)\](.*?)\[/url\]","<ahref=\"$1\"title=\"$2\">$2</a>",options);
result=Regex.Replace(result,@"\[email\](.*?)\[/email\]","<ahref=\"mailto:$1\">$1</a>",options);
returnresult;
}
privatestaticstringDecodeLinksNoFollow(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[url\]www\.(.*?)\[/url\]","<arel=\"nofollow\"href=\"http://www.$1\">$1</a>",options);
result=Regex.Replace(result,@"\[url\](.*?)\[/url\]","<arel=\"nofollow\"href=\"$1\">$1</a>",options);
result=Regex.Replace(result,@"\[url=(.*?)\](.*?)\[/url\]","<arel=\"nofollow\"href=\"$1\"title=\"$2\">$2</a>",options);
result=Regex.Replace(result,@"\[email\](.*?)\[/email\]","<ahref=\"mailto:$1\">$1</a>",options);
returnresult;
}
privatestaticstringDecodeImage(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[hr\]","<hr/>",options);
result=Regex.Replace(result,@"\[img\](.+?)\[/img\]","<imgsrc=\"$1\"alt=\"\"/>",options);
result=Regex.Replace(result,@"\[img=(\d+)x(\d+)\](.+?)\[/img\]","<imgsrc=\"$3\"style=\"width:$1px;height:$2px\"alt=\"\"/>",options);
returnresult;
}
privatestaticstringDecodeColor(stringubb)
{
stringresult=ubb;
result=Regex.Replace(result,@"\[color=(#?\w+?)\](.+?)\[/color\]","<spanstyle=\"color:$1\">$2</span>",options);
returnresult;
}
privatestaticstringDecodeStyle(stringubb)
{
stringresult=ubb;
//wedon'tneedthisforperfomanceandotherconsideration:
//(<table[^>]*>(?><table[^>]*>(?<Depth>)|</table>(?<-Depth>)|.)+(?(Depth)(?!))</table>)
result=Regex.Replace(result,@"\[[b]\](.*?)\[/[b]\]","<strong>$1</strong>",options);
result=Regex.Replace(result,@"\[[u]\](.*?)\[/[u]\]","<spanstyle=\"text-decoration:underline\">$1</span>",options);
result=Regex.Replace(result,@"\[[i]\](.*?)\[/[i]\]","<i>$1</i>",options);
returnresult;
}
}
}








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。