使用正则表达式在多个HTML标记之间获取文本
本文关键字:之间 获取 取文本 HTML 正则表达式 | 更新日期: 2023-09-27 18:09:02
使用regex,我希望能够获得多个div标记之间的文本。例如:
<div>first html tag</div>
<div>another tag</div>
将输出:
first html tag
another tag
我使用的正则表达式模式只匹配我的最后一个div标签,而错过了第一个。代码:
static void Main(string[] args)
{
string input = "<div>This is a test</div><div class='"something'">This is ANOTHER test</div>";
string pattern = "(<div.*>)(.*)(<''/div>)";
MatchCollection matches = Regex.Matches(input, pattern);
Console.WriteLine("Matches found: {0}", matches.Count);
if (matches.Count > 0)
foreach (Match m in matches)
Console.WriteLine("Inner DIV: {0}", m.Groups[2]);
Console.ReadLine();
}
输出:匹配:1
内部DIV:这是另一个测试
用非贪婪匹配替换你的模式
static void Main(string[] args)
{
string input = "<div>This is a test</div><div class='"something'">This is ANOTHER test</div>";
string pattern = "<div.*?>(.*?)<''/div>";
MatchCollection matches = Regex.Matches(input, pattern);
Console.WriteLine("Matches found: {0}", matches.Count);
if (matches.Count > 0)
foreach (Match m in matches)
Console.WriteLine("Inner DIV: {0}", m.Groups[1]);
Console.ReadLine();
}
由于其他人没有提到HTML tags with attributes
,以下是我的解决方案:
// <TAG(.*?)>(.*?)</TAG>
// Example
var regex = new System.Text.RegularExpressions.Regex("<h1(.*?)>(.*?)</h1>");
var m = regex.Match("Hello <h1 style='color: red;'>World</h1> !!");
Console.Write(m.Groups[2].Value); // will print -> World
我认为这段代码应该可以工作:
string htmlSource = "<div>first html tag</div><div>another tag</div>";
string pattern = @"<div[^>]*?>(.*?)</div>";
MatchCollection matches = Regex.Matches(htmlSource, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
ArrayList l = new ArrayList();
foreach (Match match in matches)
{
l.Add(match.Groups[1].Value);
}
首先请记住,在HTML文件中,您将有一个新的行符号("'n"),您没有将其包含在用于检查正则表达式的字符串中。
第二步,取regex:
((<div.*>)(.*)(<''/div>))+ //This Regex will look for any amount of div tags, but it must see at least one div tag.
((<div.*>)(.*)(<''/div>))* //This regex will look for any amount of div tags, and it will not complain if there are no results at all.
也是查找这类信息的好地方:
http://www.regular-expressions.info/reference.html http://www.regular-expressions.info/refadv.htmlMayman
简而言之,您不可能在所有情况下都正确地执行此操作。总会出现正则表达式无法提取所需信息的有效HTML的情况。
原因是因为HTML是一种上下文无关的语法,它是一种比正则表达式更复杂的类。
这里有一个例子——如果你有多个堆叠的div呢?
<div><div>stuff</div><div>stuff2</div></div>
作为其他答案列出的正则表达式将抓取:
<div><div>stuff</div>
<div>stuff</div>
<div>stuff</div><div>stuff2</div>
<div>stuff</div><div>stuff2</div></div>
<div>stuff2</div>
<div>stuff2</div></div>
因为这是正则表达式在解析HTML时所做的。
你不能编写一个理解如何解释所有情况的正则表达式,因为正则表达式无法做到这一点。如果您正在处理一组非常特定的受约束的HTML,那么这是可能的,但是您应该记住这个事实。
更多信息:https://stackoverflow.com/a/1732454/2022565
你看过Html敏捷包(见https://stackoverflow.com/a/857926/618649)吗?
CsQuery看起来也很有用(基本上使用CSS选择器样式的语法来获取元素)。参见https://stackoverflow.com/a/11090816/618649。
CsQuery基本上意味着"c#的jQuery",这几乎是我用来找到它的确切搜索条件。
如果你可以在web浏览器中做到这一点,你可以很容易地使用jQuery,使用类似于$("div").each(function(idx){ alert( idx + ": " + $(this).text()); }
的语法(只有你会明显地输出结果到日志,或屏幕,或使用它进行web服务调用,或任何你需要用它做的)。
我希望下面的正则表达式能起作用:
<div.*?>(.*?)<*.div>
你将得到你想要的输出
这是一个测试这是另一个测试