2015-04-15 146 views
0

我需要从html字符串中获取html元素<div class='important-contents'>...</div>中的内容(没有html标签的字符串)。如何让HTML文本中包含的文本不包含html标签文本

其实我可以使用下面的代码加载所有文本。

string htmlString= "<html>...</html>"; 
    Regex regex = new Regex("\\<[^\\>]*\\>"); 
    return regex.Replace(htmlString, String.Empty); 

如何指定important-contents类元素中的内容?

+0

我不认为正则表达式是这里的最佳路线,也有从内存中,可以得到标签的内容HTML类... –

+0

请肯定要阅读[RegEx match open tags but XHTML self-contained tags](http:// stackoverflow。com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags /)来构建合理的RegEx。 –

+2

@AustinFrench显然不是。但OP应该已经知道了(有很多HTML和C#的问题和答案)。所以虽然像HtmlAgilityPack这样的东西绝对是一种好方法,但我认为这应该作为一个练习来创建正则表达式... –

回答

1

可以匹配的是采用这种regex,具有非固定宽度的外观,背后的DIV标签内(感谢.NET正则表达式引擎):

(?s)(?<=<div\s[^>]*?class=["']?important-contents["']?[^>]*?>).*?(?=</div>) 

然后,去除所有标签,你可以使用this regex删除匹配的DIV内容中的所有标签:

</?[^>]+> 

要删除<script>标记,可能会发现自己的方式向DIV标签,下面我们来介绍另一步:

(?s)<script[^>]*?>.*?</script> 

我不知道匹配不连续文本的方法,因此只能在{2,}步骤中完成。

免责声明:如果您的HTML格式不正确,您可能会得到更奇怪的结果,或者根本不匹配。

示例代码:

var div_rgx = new Regex(@"(?si)(?<=<div\s[^>]*?class=[""']?important-contents[""']?[^>]*?>).*?(?=</div>)"); 
var tag_rgx = new Regex(@"</?[^>]+>"); 
var script_rgx = new Regex(@"(?s)<script[^>]*?>.*?</script>"); 
var txt = "<html>\r\n<body>\r\n<div class='important-contents'>\r\n<script>function getV(str) { return 0; }</script>\r\n<span>My <i>text</i><font face=\"Verdana\">.</font></span>\r\n</div>\r\n</body>\r\n</html>"; 
var result = div_rgx.Match(txt); 
if (result.Success) 
    var final = tag_rgx.Replace(script_rgx.Replace(result.Value, string.Empty), string.Empty).Trim(); 

输出:

enter image description here

+0

如果div里面有脚本块,该怎么办? (我在我的日子里看到过这种可怕的HTML,它不仅仅是为了解决你的问题,像这样的东西存在于互联网上) –

+0

好的,我把这一步加到了答案上。 –

+0

感谢@stribizhev,但这只显示不在任何html标记中的内容。例如当'

Hello World
'它返回'Hello'而它应该返回'Hello World'。另外在'if(condition)'之后,当第一行声明一个变量时有一个'{'。我编辑你的代码如下:if(result.Success){var final = tag_rgx.Replace(script_rgx.Replace(result.Value,string.Empty),string.Empty).Trim();}' – Bellash

0

使用 “ '重要-内容'>” 作为比赛,但没有捕捉锚然后消耗的所有文字,直到<被击中如

(?:'important-contents'\>)(?<Content>[^>]+) 

在上面我已将所有内容放入名为“内容”的名称匹配捕获组中以便于提取。

0

首先,正则表达式是无法做到GET字符串不包含HTML标签一般情况下,因为HTML语法是不正规。你有两个选择:

  1. 使用完整的HTML解析器和工作与DOM(答案在这里看到What is the best way to parse html in C#?例如)
  2. 放在任务一些权衡,例如 <div class='important-contents'>不会包含在内html标签。在权衡解决方案案例可能是这样的:

    var regex = `"<div class='important-contents'>(?<important>.*)</div>";` 
    MatchCollection matches = Regex.Matches(htmlString, regex); 
    foreach(Match m in matches){ 
        Console.WriteLine(m.Groups["important"].ToString()); 
    } 
    
+0

谢谢你的第一个解决方案!第二个不满足...我会在你提供的链接中遵循建议 – Bellash

相关问题