Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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_Html_Regex - Fatal编程技术网

C# 在文档中查找HTML字符串

C# 在文档中查找HTML字符串,c#,.net,html,regex,C#,.net,Html,Regex,我想在文档中获取所有HTML..。 使用Regex查找所有此类字符串,使用: Regex regex = new Regex(@"\<p\>([^\>]*)\</p\>", RegexOptions.IgnoreCase); Regex Regex=new Regex(@“\([^\>]*)\”,RegexOptions.IgnoreCase); 但是我没有得到任何结果。我的正则表达式有什么问题吗 现在,我只想获取..标记之间的所有内容,并希望使用正则表达式,因

我想在文档中获取所有HTML
..


使用
Regex
查找所有此类字符串,使用:

Regex regex = new Regex(@"\<p\>([^\>]*)\</p\>", RegexOptions.IgnoreCase);
Regex Regex=new Regex(@“\([^\>]*)\”,RegexOptions.IgnoreCase);
但是我没有得到任何结果。我的正则表达式有什么问题吗


现在,我只想获取
..

标记之间的所有内容,并希望使用正则表达式,因为源代码不是HTML文档。

使用正则表达式不是最好的主意。我建议读这篇文章:

!!!
相反,使用

例如:

var doc = new HtmlDocument();
doc.Load(...);

var pTags = doc.DocumentNode.Descendants("p");

编辑:即使文档实际上不是HTML,也可以这样做。

使用正则表达式匹配HTML元素的方法注定会失败。正则表达式不能可靠地匹配HTML元素。可以构建一个比正则表达式更复杂的HTML元素

例如,我可以用以下方法击败你的正则表达式

<p>hello<p>again</p></p>
又是你好

您需要使用HTML(或者可能是XML)解析器/DOM,而不是使用正则表达式。这是可靠地查询HTML文件的唯一方法

详细解释原因:


虽然其他人说不应该使用正则表达式执行此操作,您失败的原因是您的
标记之间有更多的HTML,您排除
会导致正则表达式不匹配。

您要求它,但除非您控制100%的HTML生成,否则确实不要使用正则表达式执行此操作

public static Regex regex = new Regex(
      "(?<open>\\<p(?<attr>[^>])*\\>)(?<content>.*)\\</p(?:\\s*)\\>",
    RegexOptions.Multiline
    | RegexOptions.CultureInvariant
    | RegexOptions.Compiled
    );
publicstaticregex Regex=newregex(
“(?\\
@”(?is)(?>(?:(?!)))*)

(?:(?!)*
一次匹配一个字符,在进行前瞻以确保它不是
标记的一部分之后

(?>…)
是一个函数;它防止我们知道毫无意义的回溯

(?is)
是指定匹配修饰符的另一种机制——在本例中为IgnoreCase和Singleline(如果标记之间存在换行符或回车符,则为后者,这是多余的,但您确实说过它不是真正的HTML)


顺便说一句,
在正则表达式中没有特殊意义,因此没有必要对它们进行转义。事实上,你可以通过转义赋予它们特殊意义:
\
分别表示“单词的开头”和“单词的结尾”。但在.NET正则表达式中,反斜杠只是杂乱无章的。请参见:

将找不到的文本。

如果您仍然不介意忽略父p标记中的所有p标记,则将文本“([^\>]*)”替换为“(.*)”“。这将匹配标签中的所有字符。请注意,您不会使用此方法匹配所有p标签。我喜欢链接的答案如何成为一种迷因。这一主题的持续性让我感到惊讶。而且90+代表是多么容易获得…:-)事实上,在达到上限之前,我从这个答案中只得到了55个重复。我只想得到..

标记之间的所有内容。什么是适合这个的正则表达式?@inutan——没有一个正则表达式可以100%工作。请参阅JaredPar的帖子。
<p>hello world</p>
<p style="Foo"></p >
<p>who nests paragraphs <p>in 2010?</p> </p  >
<p /><p><a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454">TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ</a></p><p/>
"hello world"
""
"who nests paragraphs <p>in 2010?</p>"
"<p><a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454">TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ</a>"
@"(?is)<p>(?>(?:(?!</?p>).)*)</p>"