使用正则表达式提取部分html

时间:2010-04-22 19:07:10

标签: html regex

我有一个简单的要求在html中提取文本。假设html是

<h1>hello</h1> ... <img moduleType="calendar" /> ...<h2>bye</h2> 

我想将其转换为三个部分

<h1>hello</h1> 
<img moduleType="calendar" />
<h2>bye</h2> 

目的是提取两个类别的文本,简单的html和带有&lt; img moduleType =“Calendar”的特殊标签。

3 个答案:

答案 0 :(得分:1)

不要那样做; HTML可以通过许多美妙的方式打破。请改用beautiful soup

答案 1 :(得分:0)

这取决于您使用的语言和背景。我在CMS上做了类似的事情,我的方法是首先找到标签,然后是属性。

获取标签

"<img (.*?)/>"

然后我在结果中搜索特定属性

'title="(.*?)"'

如果要查找所有属性,可以轻松地将显式标题更改为正则表达式[a-z]或非空白字符,然后循环显示这些结果。

答案 2 :(得分:0)

我实际上尝试做类似的事情,因为asp.net编译器将标记编译到服务器控制树中,正则表达式被asp.net编译器大量使用。我有一个临时的解决方案,虽然不是很好,但似乎没问题。

//string source = "<h1>hello</h1>";
string source = "<h1>hello<img moduleType=\"calendar\" /></h1> <p> <img moduleType=\"calendar\" /> </p> <h2>bye</h2> <img moduleType=\"calendar\" /> <p>sss</p>";
Regex exImg = new Regex("(.+?)(<img.*?/>)");

var match = exImg.Match(source);
int lastEnd = 0;
while (match.Success)
{
    Console.WriteLine(match.Groups[1].Value);
    Console.WriteLine(match.Groups[2].Value);
    lastEnd = match.Index + match.Length;
    match = match.NextMatch();
}
Console.WriteLine(source.Substring(lastEnd, source.Length - lastEnd ));