我需要匹配所有这些开头标记:

<p>
<a href="foo">

但不是这些:

<br />
<hr class="foo" />

我想出了这个,想确保我做得对。我只是在捕捉a-z。

<([a-z]+) *[^/]*?>

我相信上面写着:

找到一个小于,然后查找(并捕获)a-z一次或多次,然后找到零个或多个空格,然后查找任何字符零次或多次,贪婪,除了/,然后查找大于

我有这个权利吗?更重要的是,你怎么看?


当前回答

无法使用正则表达式解析[X]HTML。因为正则表达式无法解析HTML。Regex不是一个可以用来正确解析HTML的工具。正如我之前多次在这里回答的HTML和正则表达式问题一样,正则表达式的使用不允许您使用HTML。正则表达式是一种不够复杂的工具,无法理解HTML所使用的构造。HTML不是一种正则语言,因此不能由正则表达式解析。Regex查询无法将HTML分解为有意义的部分。很多次,但我都不明白。即使是Perl使用的增强型不规则正则表达式,也无法完成解析HTML的任务。你永远不会让我崩溃。HTML是一种非常复杂的语言,它不能被正则表达式解析。甚至Jon Skeet也无法使用正则表达式解析HTML。每次你试图用正则表达式解析HTML时,这个邪恶的孩子都会痛哭流涕,而俄罗斯黑客则会在你的网络应用程序上进行攻击。用正则表达式解析HTML会将受污染的灵魂召唤到活人的领域。HTML和正则表达式就像爱情、婚姻和仪式性的杀婴。<center>无法保持它太晚了。正则表达式和HTML在同一概念空间中的合力会像水一样摧毁你的思想。如果你用正则表达式解析HTML,你就屈服于他们和他们的亵渎方式,这让我们所有人都要为一个名字无法在基本多语言平面中表达的人付出不人道的努力,他来了。HTML加正则表达式将使n​当你观察时,你的心灵在恐惧的冲击中枯萎。基于x的HTML解析器是杀死StackOverflow的癌症,为时已晚,为时不晚,我们无法得救,因为一个chi͡ld的犯罪确保了regex将吞噬所有的活组织(除了它不能消耗的HTML,如前所预言的那样)亲爱的主,请帮助我们,任何人如何能在这场灾难中幸存下来,使用regex来解析HTML已经注定了人类将遭受永恒的可怕折磨使用正则表达式作为处理HTML的工具的安全漏洞在这个世界和c͒ͪo͛ͫ腐败实体(如SGML实体,但更腐败)的可怕领域之间建立了一个漏洞,这仅仅是对reg世界的一瞥​用于HTML的ex解析器将​他突然把一个程序员的意识带入了一个不断尖叫的世界,瘟疫般的slithy regex感染会​我吞噬你的HT​ML解析器、应用程序和存在一直像Visual Basic一样,但更糟糕的是他来了,他来了就不来了​对他来说​s un̨hoğly radiańcé; destro҉ying all enli̍̈́س\836收紧,HTML标签lea͠ki̧n͘g fr ǫm̡yo​͟我们的眼睛͢s̸̛l̕ik͏e liq​uid pain,re̸gular exp之歌​压缩解析将退出​用英语表达摩尔的声音​来自sp的塔尔曼​在这里我可以看到它,你可以看到它吗​他终于揭穿了谎言​人的全部都是LOS͖̩͇̗̪̏̈́T ALL I​当他来的时候,他就失去了机会​或渗透到我的脸上ᵒ天啊不不不​O NΘ停止​*̶͑̾̾​ͫ͏̙̤g͛838̾ͫ;͇̫̑͆l​ot rȇͧ̌aͨl̘̝̙ͤ͂̾̆ZA̡͊͠LGΌISͮ;҉̛̯͈͕̹ͼ̱TO̶͇̺ͅƝȳ̳TH̘; Ë͖́̉\864 P͍̭O̚​N̐Y̡Hͨ͊̽س̾̎801;̸̪̯E̾;̧̲̬͛ͪ̈́͘809;ͧ⁲̨̦̱̹̭̰C \877̙̝͖̏Oͮ͏7;͍M͊̒ͪ̚873; 876;Ỿ860;̲̖Ȇ∱̛̟͌S̨̥̫͎ͯ̿̔̀ͅ


您是否尝试过改用XML解析器?


主持人说明此帖子已锁定,以防止对其内容进行不当编辑。这篇文章看起来和它应该看起来完全一样——它的内容没有问题。请不要为我们的注意标记。

其他回答

无法使用正则表达式解析[X]HTML。因为正则表达式无法解析HTML。Regex不是一个可以用来正确解析HTML的工具。正如我之前多次在这里回答的HTML和正则表达式问题一样,正则表达式的使用不允许您使用HTML。正则表达式是一种不够复杂的工具,无法理解HTML所使用的构造。HTML不是一种正则语言,因此不能由正则表达式解析。Regex查询无法将HTML分解为有意义的部分。很多次,但我都不明白。即使是Perl使用的增强型不规则正则表达式,也无法完成解析HTML的任务。你永远不会让我崩溃。HTML是一种非常复杂的语言,它不能被正则表达式解析。甚至Jon Skeet也无法使用正则表达式解析HTML。每次你试图用正则表达式解析HTML时,这个邪恶的孩子都会痛哭流涕,而俄罗斯黑客则会在你的网络应用程序上进行攻击。用正则表达式解析HTML会将受污染的灵魂召唤到活人的领域。HTML和正则表达式就像爱情、婚姻和仪式性的杀婴。<center>无法保持它太晚了。正则表达式和HTML在同一概念空间中的合力会像水一样摧毁你的思想。如果你用正则表达式解析HTML,你就屈服于他们和他们的亵渎方式,这让我们所有人都要为一个名字无法在基本多语言平面中表达的人付出不人道的努力,他来了。HTML加正则表达式将使n​当你观察时,你的心灵在恐惧的冲击中枯萎。基于x的HTML解析器是杀死StackOverflow的癌症,为时已晚,为时不晚,我们无法得救,因为一个chi͡ld的犯罪确保了regex将吞噬所有的活组织(除了它不能消耗的HTML,如前所预言的那样)亲爱的主,请帮助我们,任何人如何能在这场灾难中幸存下来,使用regex来解析HTML已经注定了人类将遭受永恒的可怕折磨使用正则表达式作为处理HTML的工具的安全漏洞在这个世界和c͒ͪo͛ͫ腐败实体(如SGML实体,但更腐败)的可怕领域之间建立了一个漏洞,这仅仅是对reg世界的一瞥​用于HTML的ex解析器将​他突然把一个程序员的意识带入了一个不断尖叫的世界,瘟疫般的slithy regex感染会​我吞噬你的HT​ML解析器、应用程序和存在一直像Visual Basic一样,但更糟糕的是他来了,他来了就不来了​对他来说​s un̨hoğly radiańcé; destro҉ying all enli̍̈́س\836收紧,HTML标签lea͠ki̧n͘g fr ǫm̡yo​͟我们的眼睛͢s̸̛l̕ik͏e liq​uid pain,re̸gular exp之歌​压缩解析将退出​用英语表达摩尔的声音​来自sp的塔尔曼​在这里我可以看到它,你可以看到它吗​他终于揭穿了谎言​人的全部都是LOS͖̩͇̗̪̏̈́T ALL I​当他来的时候,他就失去了机会​或渗透到我的脸上ᵒ天啊不不不​O NΘ停止​*̶͑̾̾​ͫ͏̙̤g͛838̾ͫ;͇̫̑͆l​ot rȇͧ̌aͨl̘̝̙ͤ͂̾̆ZA̡͊͠LGΌISͮ;҉̛̯͈͕̹ͼ̱TO̶͇̺ͅƝȳ̳TH̘; Ë͖́̉\864 P͍̭O̚​N̐Y̡Hͨ͊̽س̾̎801;̸̪̯E̾;̧̲̬͛ͪ̈́͘809;ͧ⁲̨̦̱̹̭̰C \877̙̝͖̏Oͮ͏7;͍M͊̒ͪ̚873; 876;Ỿ860;̲̖Ȇ∱̛̟͌S̨̥̫͎ͯ̿̔̀ͅ


您是否尝试过改用XML解析器?


主持人说明此帖子已锁定,以防止对其内容进行不当编辑。这篇文章看起来和它应该看起来完全一样——它的内容没有问题。请不要为我们的注意标记。

这里有一些很好的正则表达式,可以用BBCode替换HTML。对于所有反对者来说,请注意,他并不是试图完全解析HTML,只是为了净化它。他可能可以消除那些简单的“解析器”无法理解的标记。

例如:

$store =~ s/http:/http:\/\//gi;
$store =~ s/https:/https:\/\//gi;
$baseurl = $store;

if (!$query->param("ascii")) {
    $html =~ s/\s\s+/\n/gi;
    $html =~ s/<pre(.*?)>(.*?)<\/pre>/\[code]$2\[\/code]/sgmi;
}

$html =~ s/\n//gi;
$html =~ s/\r\r//gi;
$html =~ s/$baseurl//gi;
$html =~ s/<h[1-7](.*?)>(.*?)<\/h[1-7]>/\n\[b]$2\[\/b]\n/sgmi;
$html =~ s/<p>/\n\n/gi;
$html =~ s/<br(.*?)>/\n/gi;
$html =~ s/<textarea(.*?)>(.*?)<\/textarea>/\[code]$2\[\/code]/sgmi;
$html =~ s/<b>(.*?)<\/b>/\[b]$1\[\/b]/gi;
$html =~ s/<i>(.*?)<\/i>/\[i]$1\[\/i]/gi;
$html =~ s/<u>(.*?)<\/u>/\[u]$1\[\/u]/gi;
$html =~ s/<em>(.*?)<\/em>/\[i]$1\[\/i]/gi;
$html =~ s/<strong>(.*?)<\/strong>/\[b]$1\[\/b]/gi;
$html =~ s/<cite>(.*?)<\/cite>/\[i]$1\[\/i]/gi;
$html =~ s/<font color="(.*?)">(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<font color=(.*?)>(.*?)<\/font>/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/<link(.*?)>//gi;
$html =~ s/<li(.*?)>(.*?)<\/li>/\[\*]$2/gi;
$html =~ s/<ul(.*?)>/\[list]/gi;
$html =~ s/<\/ul>/\[\/list]/gi;
$html =~ s/<div>/\n/gi;
$html =~ s/<\/div>/\n/gi;
$html =~ s/<td(.*?)>/ /gi;
$html =~ s/<tr(.*?)>/\n/gi;

$html =~ s/<img(.*?)src="(.*?)"(.*?)>/\[img]$baseurl\/$2\[\/img]/gi;
$html =~ s/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/\[url=$baseurl\/$2]$4\[\/url]/gi;
$html =~ s/\[url=$baseurl\/http:\/\/(.*?)](.*?)\[\/url]/\[url=http:\/\/$1]$2\[\/url]/gi;
$html =~ s/\[img]$baseurl\/http:\/\/(.*?)\[\/img]/\[img]http:\/\/$1\[\/img]/gi;

$html =~ s/<head>(.*?)<\/head>//sgmi;
$html =~ s/<object>(.*?)<\/object>//sgmi;
$html =~ s/<script(.*?)>(.*?)<\/script>//sgmi;
$html =~ s/<style(.*?)>(.*?)<\/style>//sgmi;
$html =~ s/<title>(.*?)<\/title>//sgmi;
$html =~ s/<!--(.*?)-->/\n/sgmi;

$html =~ s/\/\//\//gi;
$html =~ s/http:\//http:\/\//gi;
$html =~ s/https:\//https:\/\//gi;

$html =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gsi;
$html =~ s/\r\r//gi;
$html =~ s/\[img]\//\[img]/gi;
$html =~ s/\[url=\//\[url=/gi;

有些人会告诉你地球是圆的(如果他们想用奇怪的话,也许地球是一个扁球体)。他们在撒谎。

有些人会告诉你正则表达式不应该是递归的。他们在限制你。他们需要征服你,他们让你蒙在鼓里。

你可以生活在他们的现实中,也可以服用红色药丸。

就像Marshal勋爵(他是Marshal.NET类的亲戚吗?)一样,我也看过Underverse Stack Based Regex Verse,并以你无法想象的力量知识返回。是的,我想有一两个老一号在保护他们,但他们在电视上看足球,所以这并不难。

我认为XML的情况非常简单。RegEx(在.NET语法中)是用base64压缩和编码的,以使你脆弱的头脑更容易理解,应该是这样的:

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
+r/vD34mUADO1P4/AQAA//8=

要设置的选项是RegexOptions.ExplicitCapture。您要查找的捕获组是ELEMENTNAME。如果捕获组ERROR不为空,则存在解析错误,Regex停止。

如果您在将其重新转换为人类可读的正则表达式时遇到问题,这将有助于:

static string FromBase64(string str)
{
    byte[] byteArray = Convert.FromBase64String(str);

    using (var msIn = new MemoryStream(byteArray))
    using (var msOut = new MemoryStream()) {
        using (var ds = new DeflateStream(msIn, CompressionMode.Decompress)) {
            ds.CopyTo(msOut);
        }

        return Encoding.UTF8.GetString(msOut.ToArray());
    }
}

如果你不确定,不,我不是在开玩笑(但也许我在撒谎)。它会奏效的。我构建了大量的单元测试来测试它,我甚至使用了(部分)一致性测试。它是一个标记化器,而不是一个完整的解析器,因此它只会将XML拆分为其组件标记。它不会解析/集成DTD。

哦如果需要正则表达式的源代码,请使用一些辅助方法:

正则表达式,用于标记xml或纯正则表达式

RegEx匹配除XHTML自包含标记之外的开放标记跳过所有其他标记(和内容)。


这个正则表达式就是这样做的。如果您只需要匹配特定的Open标记,请列出一个列表替换(?:p | br |<whatever tags you want>)并替换[\w:]+构造在下面的适当位置。

<(?:(?::(?):(script | style | object | embed | applet | noframes | noscript | noembed)(?:\s+(?>“[\s\s]*?”|'[\s\s]*?'|(?:?\s*>)[\s\s]*</\1\s*(?=>)(*跳过)(*失败))|(?:[\w:]+\b(?=((?:“[\s\s]*?”|'[\s\s]*?'|[^>]?)*)>)\2(?<!/))|/?)|\?[\S\S]*?\|(?:

https://regex101.com/r/uMvJn0/1

 # Mix html/xml     
 # https://regex101.com/r/uMvJn0/1     
 
 <
 (?:
    
    # Invisible content gets failed
    
    (?:
       (?:
                               # Invisible content; end tag req'd
          (                    # (1 start)
             script
           | style
           | object
           | embed
           | applet
           | noframes
           | noscript
           | noembed 
          )                    # (1 end)
          (?:
             \s+ 
             (?>
                " [\S\s]*? "
              | ' [\S\s]*? '
              | (?:
                   (?! /> )
                   [^>] 
                )?
             )+
          )?
          \s* >
       )
       
       [\S\s]*? </ \1 \s* 
       (?= > )
       (*SKIP)(*FAIL)
    )
    
  | 
    
    # This is any open html tag we will match
    
    (?:
       [\w:]+ \b 
       (?=
          (                    # (2 start)
             (?:
                " [\S\s]*? " 
              | ' [\S\s]*? ' 
              | [^>]? 
             )*
          )                    # (2 end)
          >
       )
       \2 
       (?<! / )
    )
    
  | 
    # All other tags get failed
    
    (?:
       (?: /? [\w:]+ \s* /? )
     | (?:
          [\w:]+ 
          \s+ 
          (?:
             " [\S\s]*? " 
           | ' [\S\s]*? ' 
           | [^>]? 
          )+
          \s* /?
       )
     | \? [\S\s]*? \?
     | (?:
          !
          (?:
             (?: DOCTYPE [\S\s]*? )
           | (?: \[CDATA\[ [\S\s]*? \]\] )
           | (?: -- [\S\s]*? -- )
           | (?: ATTLIST [\S\s]*? )
           | (?: ENTITY [\S\s]*? )
           | (?: ELEMENT [\S\s]*? )
          )
       )
    )
    (*SKIP)(*FAIL)
 )
 >

如果您只需要标记名,那么应该可以通过正则表达式执行此操作。

<([a-zA-Z]+)(?:[^>]*[^/] *)?>

应该做你需要的事。但我认为“莫里茨”的解决方案已经很好了。我一开始没看到。

对于所有反对者:在某些情况下,使用正则表达式是有意义的,因为这可能是最简单、最快捷的解决方案。我同意一般情况下不应该用正则表达式解析HTML。

但是当你有一个HTML子集,你知道格式并且你只想提取一些值时,正则表达式可以是一个非常强大的工具。我这样做了数百次,几乎总是达到我想要的目的。