首页 新闻 会员 周边

请教一个去掉空行的正则表达式?

0
悬赏园豆:200 [已解决问题] 解决于 2012-03-14 13:01

需求是这样的,用户在文本编辑器中输入内容,最后提交到数据库,在提交时要把内容前面和后面的空行(中间的不能去掉)去掉,因为用户输入的内容不可预知,所以现要在做的就是把用户提交的内容前面和后面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>
artwl的主页 artwl | 专家六级 | 园豆:16736
提问于:2012-03-14 10:02
< >
分享
最佳答案
0

假如是

<div>
<span><br/>bc</span>
<p>te<br>st</p>
</div>

不需要过滤成这样吧

<div>
<span>bc</span>
<p>te<br>st</p>
</div>
收获园豆:200
LCM | 大侠五级 |园豆:6876 | 2012-03-14 10:21

不需要,有内容的部分不过滤

artwl | 园豆:16736 (专家六级) | 2012-03-14 10:22

@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>");
LCM | 园豆:6876 (大侠五级) | 2012-03-14 10:55

@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 | 园豆:6876 (大侠五级) | 2012-03-14 11:17

@LCM: 谢谢回复哈,我马上测试一下。我自己写了一个JavaScript版的,在下面的回复中。

artwl | 园豆:16736 (专家六级) | 2012-03-14 11:25

@LCM: 刚才发现我写的也有点问题,还要修改

artwl | 园豆:16736 (专家六级) | 2012-03-14 11:28

@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 | 园豆:16736 (专家六级) | 2012-03-14 11:35

@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>$";

修改了一点点。

LCM | 园豆:6876 (大侠五级) | 2012-03-14 12:17
其他回答(1)
0

哈哈,自己写了一个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

artwl | 园豆:16736 (专家六级) | 2012-03-14 11:24

嗯,假如html字符串中的节点不是很多的话,遍历可以实现,转化成xml也可以实现。

不过你的有问题的,假如<br>在中间,也会被移除的。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2012-03-14 11:35

@LCM: 是的,我也发现了哈,正在修改

支持(0) 反对(0) artwl | 园豆:16736 (专家六级) | 2012-03-14 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册