对于用户上传不规划Html而导致页面布局错乱的一简单解决方法
2013-02-28 10:46
585 查看
现在大多网站中都允许用户使用“Html在线编辑器”类的程序发表日记、评论等,好处当然是可以提供丰富的功能,不过用户的电脑知识有深有浅、素质也是有高有低,也就会出现一些不规则的Html破坏版面。
作为开发人员,也是想近办法屏蔽或修正这些不规则的Html,一般方法就是使用正则表达式进行匹配查找。
有一种破坏版面布局的Html本身并没有使用特殊的标记,只是会缺少开始或结束标签,比如:
<div style="color:#666;">
这里是内容
<strong>这里是加粗的内容</strong>
很明显,上面的内容缺少了结束div标签:</div>
我曾在网上搜索验证html内容是否完整的方法,不过没有找到好的方法(有示例说可以用SgmlReader转成XML,只是我需要的还是Html,这样转来转去会很麻烦)
今天换了一种思考方式:通过判断html内容中的开始div标签与结束div标签的数量是否一致来大概验证html内容的是否不完整,代码如下:
public static string RenderHtml(this HtmlHelper helper, string htmlContent)
{
htmlContent = NoScriptText(htmlContent);//去掉脚本、注释、style、<body>、<html>、<marquee>等特殊字符、标签
int divLen = 0;
int endDivLen = 0;
MatchCollection m = Regex.Matches(htmlContent, @"(<div>)|(<div .*?>)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
divLen = m.Count;
m = Regex.Matches(htmlContent, @"</div>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
endDivLen = m.Count;
if (endDivLen != divLen)
{
if (divLen > endDivLen)
{
for (int i = 0; i < divLen - endDivLen; i++)
{
htmlContent += "</div>";
}
}
else
{
for (int i = 0; i < endDivLen - divLen; i++)
{
htmlContent = "<div>" + htmlContent;
}
}
}
return htmlContent;
}
调用:
<div class="article_content">
<%=Html.RenderHtml(Model.Content) %>
</div>
作为开发人员,也是想近办法屏蔽或修正这些不规则的Html,一般方法就是使用正则表达式进行匹配查找。
有一种破坏版面布局的Html本身并没有使用特殊的标记,只是会缺少开始或结束标签,比如:
<div style="color:#666;">
这里是内容
<strong>这里是加粗的内容</strong>
很明显,上面的内容缺少了结束div标签:</div>
我曾在网上搜索验证html内容是否完整的方法,不过没有找到好的方法(有示例说可以用SgmlReader转成XML,只是我需要的还是Html,这样转来转去会很麻烦)
今天换了一种思考方式:通过判断html内容中的开始div标签与结束div标签的数量是否一致来大概验证html内容的是否不完整,代码如下:
public static string RenderHtml(this HtmlHelper helper, string htmlContent)
{
htmlContent = NoScriptText(htmlContent);//去掉脚本、注释、style、<body>、<html>、<marquee>等特殊字符、标签
int divLen = 0;
int endDivLen = 0;
MatchCollection m = Regex.Matches(htmlContent, @"(<div>)|(<div .*?>)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
divLen = m.Count;
m = Regex.Matches(htmlContent, @"</div>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
endDivLen = m.Count;
if (endDivLen != divLen)
{
if (divLen > endDivLen)
{
for (int i = 0; i < divLen - endDivLen; i++)
{
htmlContent += "</div>";
}
}
else
{
for (int i = 0; i < endDivLen - divLen; i++)
{
htmlContent = "<div>" + htmlContent;
}
}
}
return htmlContent;
}
调用:
<div class="article_content">
<%=Html.RenderHtml(Model.Content) %>
</div>
相关文章推荐
- 对于用户上传不规划Html而导致页面布局错乱的一简单解决方法
- SELinux限制导致VSFTP匿名用户不能上传文件问题解决方法
- 更新KB905474导致用户桌面背景变黑和盗版提示的简单解决方法(20号盗版末日解决方法)
- 解决软键盘弹起导致gridview的布局错乱的方法(转载)
- CSS 控制因Html页面高度导致抖动的问题解决方法
- 窗口缩放导致页面排版错乱的解决方法
- 用一个最简单方法解决asp.net页面刷新导致数据的重复提交
- Dialog出现页面布局错乱解决方法
- 使用EhCache时,用户按住F5刷新页面,导致socket write error错误的解决方法
- ASP.NET response.write alert后 导致页面布局改变的解决方法
- win7 IIS7内置用户设置导致访问页面503错误解决方法
- Dynamics CRM webresource中的html页面url加参数后浏览报500错的解决方法
- html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题
- linux环境配置nginx导致页面不刷新的解决方法
- vsftpd 本地用户无法上传文件解决方法
- MariaDB中1045权限错误导致拒绝用户访问的错误解决方法
- 一个页面中使用多个iframe导致在ie中假死问题的解决方法
- Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除。解决方法
- js style.display=block显示布局错乱问题的解决方法
- html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题