Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式提取特定HTML标记中的纯文本_C#_.net_Regex - Fatal编程技术网

C# 正则表达式提取特定HTML标记中的纯文本

C# 正则表达式提取特定HTML标记中的纯文本,c#,.net,regex,C#,.net,Regex,在这种情况下,我应该只使用一个正则表达式匹配。 请参阅以下HTML代码: <html> <body> <p>This is some <strong>strong</strong> text</p> </body> </html> 这是一些strong文本 我想制作一个可以返回的正则表达式,这是一些强文本。在本例中,标记内的文本 总的来说,它应该: 仅匹配两个HTML标记之间的

在这种情况下,我应该只使用一个正则表达式匹配。
请参阅以下HTML代码:

<html>
  <body>
    <p>This is some <strong>strong</strong> text</p>
  </body>
</html>

这是一些strong文本

我想制作一个可以返回
的正则表达式,这是一些强文本。在本例中,
标记内的文本

总的来说,它应该:

  • 仅匹配两个HTML标记之间的文本
  • 排除两个标记中的HTML标记,但将文本保留在这些标记中
到目前为止,我知道:

  • (.*)
    将匹配从

  • ]*>
    将匹配任何HTML标记
对我来说,最困难的部分是如何将两者结合起来(也许有更好的方法)。
你将如何编写这样的正则表达式?

真正的软件工程师如何解决这个问题:为正确的工作使用正确的工具,即不要使用正则表达式解析HTML

最直接的方法是使用HTML解析库,因为用正则表达式解析即使是完全一致的XML也是非常不容易的,处理所有HTML边缘情况是一项非常困难的任务


如果您的要求是“必须使用正则表达式库从
元素中提取innerHTML”,我更愿意将其分为两个任务:

1) 使用regex提取容器元素及其innerHTML。(我展示了一个仅适用于获取已知标记的最外层元素的示例。要提取任意嵌套项,必须使用一些技巧,如匹配平衡表达式)

2) 使用简单的Regex.Replace删除所有标记内容

let html = @"<p>This is some <strong>strong</strong> text</p>
<p>This is some <b><em>really<strong>strong</strong><em></b> text</p>"

for m in Regex.Matches(html, @"<p>(.*?)</p>") do
    printfn "(%O)" (Regex.Replace(m.Groups.[1].Value, "<.*?>", ""))

(This is some strong text)
(This is some reallystrong text)


请记住,上述两个示例在格式错误的HTML上或在@Jimmy的回答之后相同标记嵌套在itsel中的情况下都不太适用,在关于如何“提取”文本的文章标题中,我想我应该包括Regex.Replace的C代码

这段代码可以用来提取文本:

string HTML = "<html><body><p>This is some <strong>strong</strong> text</p></body></html>";

Regex Reg = new Regex("<[^>]*>");
String parsedText = Reg.Replace(HTML, "").Trim();

MessageBox.Show(parsedText);
string HTML=“这是一些strongtext

”; 正则表达式Reg=新正则表达式(“]*>”); 字符串parsedText=Reg.Replace(HTML,“”.Trim(); MessageBox.Show(解析文本);
显然,这两个标记之间并不完全匹配(它也会捕获段落标记之外的任何内容),但我建议,在只进行一个匹配时,replace函数是最好的选择

如果您只需要获取两个标记之间的内容,我认为您需要按照@Jimmy的建议,在两个表达式中实现这一点


我很想知道是否有人能用一种表达方式表达出来,但我猜这就是他们在你们学校寻找的东西。

认真研究
HtmlAgilityPack
(通过Nuget免费提供)-它会让你成为一个更快乐的人!也许像HtmlAgilityPack()这样的东西更适合你的需要。在我的学校里,它是作为一项练习任务提供的。这是一个多么糟糕的正则表达式教学例子啊。作为您老师的示例,请添加一个

、一个
和一个>>
string HTML = "<html><body><p>This is some <strong>strong</strong> text</p></body></html>";

Regex Reg = new Regex("<[^>]*>");
String parsedText = Reg.Replace(HTML, "").Trim();

MessageBox.Show(parsedText);