需求是这样的,用户在文本编辑器中输入内容,最后提交到数据库,在提交时要把内容前面和后面的空行(中间的不能去掉)去掉,因为用户输入的内容不可预知,所以现要在做的就是把用户提交的内容前面和后面HTML元素(HTML代码是编辑器产生的)内容为空(\n和<br>或<br/>不算内容)的过滤掉。
用JavaScript或C#都行
示例内容:
<div>
<p><span><br></span></p>
<span>a<br/>bc</span>
<p>te<br>st</p>
<p>\n<span>\n</span></p>
<p><span><br/></span></p>
</div>
过滤后要得到的内容为:
<div>
<span>a<br/>bc</span>
<p>te<br>st</p>
</div>
假如是
<div>
<span><br/>bc</span>
<p>te<br>st</p>
</div>
不需要过滤成这样吧
<div>
<span>bc</span>
<p>te<br>st</p>
</div>
不需要,有内容的部分不过滤
@artwl: 试试这个
string regStr = @"<div>\s*(<(?<tag>[^>]*)>\s*(<[^>]*>|\\n)*</\k<tag>>\s*)*(?<html>([\w\W]*?))(<(?<tag>[^>]*)>\s*(<[^>]*>|\\n)*</\k<tag>>\s*)*</div>";
string s = textBox2.Text.Trim();
Regex reg = new Regex(regStr, RegexOptions.Compiled|RegexOptions.IgnoreCase);
Match match = reg.Match(s);
string html = match.Groups["html"].Value;
Console.WriteLine("<div>"+html+"</div>");
@artwl: 修改了一点点,刚没考虑到\n没被包裹着的情况。
string regStr = @"<div>\s*(<(?<tag>[^>]*)>\s*(<[^>]*>|\\n)*</\k<tag>>\s*|\\n|\s|<br\s*>|<br\s*/\s*)*(?<html>([\w\W]*?))(<(?<tag>[^>]*)>\s*(<[^>]*>|\\n)*</\k<tag>>\s*|\\n|\s|<br\s*>|<br\s*/\s*)*</div>";
@LCM: 谢谢回复哈,我马上测试一下。我自己写了一个JavaScript版的,在下面的回复中。
@LCM: 刚才发现我写的也有点问题,还要修改
@LCM: 我测试了一下你的,结果如下:
<div><span>a<br/>bc</span><p><span><br></span></p><p>te<br>st</p><p>
<span>
</span></p></div>
测试代码:
var test = "<div><p><span><br></span></p><div><p><span><br></span></p><span>a<br/>bc</span><p><span><br></span></p><p>te<br>st</p><p>\n<span>\n</span></p><p><span><br/></span></p></div><p><span><br></span></p></div>";
string regStr = @"<div>\s*(<(?<tag>[^>]*)>\s*(<[^>]*>|\\n)*</\k<tag>>\s*|\\n|\s|<br\s*>|<br\s*/\s*)*(?<html>([\w\W]*?))(<(?<tag>[^>]*)>\s*(<[^>]*>|\\n)*</\k<tag>>\s*|\\n|\s|<br\s*>|<br\s*/\s*)*</div>";
Regex reg = new Regex(regStr, RegexOptions.Compiled | RegexOptions.IgnoreCase);
Match match = reg.Match(test);
string html = match.Groups["html"].Value;
Console.WriteLine("<div>" + html + "</div>");
正确的应该是:
<div>
<div>
<span>a<br/>bc</span>
<p><span><br></span></p>
<p>te<br>st</p>
</div>
</div>
貌似还有点小问题
@artwl:
string regStr = @"^<div>\s*(<(?<tag>[^>]*)>(<[^>]*>|\\n|\s*)*</\k<tag>>\s*|\\n|\s|<br\s*>|<br\s*/\s*)*(?<html>([\w\W]*?))(<(?<tag>[^>]*)>(<[^>]*>|\\n|\s*)*</\k<tag>>\s*|\\n|\s|<br\s*>|<br\s*/\s*)*</div>$";
修改了一点点。
哈哈,自己写了一个JavaScript版本的:
<!DOCTYPE html>
<html>
<head>
<title>Demo</title>
<meta charset="utf-8"/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
var test="<p><span><br></span></p><div><p><span><br></span></p><span>a<br/>bc</span><p>te<br>st</p><p>\n<span>\n</span></p><p><span><br/></span></p></div><p><span><br></span></p>";
alert(removeEmptyLine(test));
});
function removeEmptyLine(val){
var el=$("<div></div>");
var txtArr=[],eleArr=[];
el.html(val);
$("*",el).each(function(index,item){
if($(item)[0].nodeName!="BR"){
txtArr.push($(item).text());
eleArr.push($(item));
}
});
for(var i=0;i<txtArr.length;i++){
if(txtArr[i].replace(/[\/n|<br>|<br/>|\s*]/ig,"")===""){
eleArr[i].remove();
}
}
var s=el.html();
delete el;
return s;
}
</script>
</head>
<body>
</body>
</html>
在线演示地址:http://jscode.chinacxy.com/code/804ecdc9a98b62b95130ee55830bfa19.aspx
嗯,假如html字符串中的节点不是很多的话,遍历可以实现,转化成xml也可以实现。
不过你的有问题的,假如<br>在中间,也会被移除的。
@LCM: 是的,我也发现了哈,正在修改