RegEx 匹配打开的标记, 但 XHTML 独立标记除外

共30个回答,已解决, 标签: html regex xhtml

我需要匹配所有这些打开的标签:

第1个答案(采用)

不能用正则表达式分析 [X] HTML。因为 HTML 不能通过正则表达式进行分析。Regex 不是可用于正确分析 HTML 的工具。正如我在这里多次回答的 html 和正则表达式问题中所说, 使用正则表达式将不允许您使用 HTML。正则表达式是一种工具, 它不够复杂, 无法理解 HTML 使用的构造。HTML 不是常规语言, 因此不能通过正则表达式进行分析。正则表达式查询不具备将 HTML 分解为有意义的部分的能力。很多次了, 但对我来说却没有。即使 Perl 使用的增强的不规则正则表达式也不能胜任解析 HTML 的任务。你永远不会让我崩溃。HTML 是一种足够复杂的语言, 不能通过正则表达式进行分析。即使是 Jon Skeet 也不能使用正则表达式解析 HTML。每次你试图用正则表达式解析 HTML 时, 这个邪恶的孩子都会哭泣处女的血液, 而俄罗斯黑客会向你的网络应用程序提供支持。解析 HTML 与正则表达式召唤被污染的灵魂入生活的领土。HTML 和正则表达式像爱情、婚姻和祭祀杀婴一样在一起。中。

不能举行它为时已晚。在相同的概念空间中, 正则表达式和 HTML 在一起的力量会像这么多水汪汪的油灰一样摧毁你的心灵。如果你用正则表达式解析 HTML, 你是在给他们和他们的亵渎方式, 这注定我们所有的非人道的辛劳为一个谁的名字不能表达在基本多语言平面, 他来了。当你观察的时候, 你的心灵会在恐怖的冲击中枯萎。Rege̿̔̉x-based HTML 解析器是杀死 StackOverflow 的癌症, 为时已晚, 我们无法保存_chi͡ld 确保正则表达式将消耗所有活组织 (html 除外, 它不能像以前预言的那样) *亲爱的主帮助我们, 如何才能让任何人生存这个祸害使用正则表达法解析 html 注定了人类的恐惧折磨和安全漏洞的永恒使用 regex 作为工具来处理 html 建立了这个世界和恐惧之间的 c͒ͪo͛ͫrrupt 实体 (如 SGML 实体, 但更腐败) 的领域, 仅仅是一个世界的一瞥的国际 reg解析器的 html 将在方便地运输一个 p_rogrammer 的意识, 我 nnnnnd 的不断尖叫, 他来了瘟疫的 slisy 的原发感染将消耗您的 html 解析器, 应用和存在的所有时间, 如 visual basic只更糟糕, 他来了, 他不_com̡e̶s, ̕h̵iun̨ho͞lyde_stro ҉ lea͠ki̧n͘g fr̶ǫm ̡yo͟ur_eye͢s̸̛l̕ik͏e 的 re̸gular 的歌曲 exp 的 ssion 解析将从这里的 *sp中看到它的摩尔人的声音, 我可以看到它你能看出 ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ 很美吗?如果 inal snuf _男人的谎言都*是 LOŚ͖̩͇̗̪̏̈́T 的是, 他来了 pon̷y 他来了c̶̮om 他不愿意我的脸哦, 天啊, 也没有诺奥克*斯克, 我的脸, 我的脸, 我的脸, 我的脸\, 我的脸, 我的脸, 我的脸 ͎a̧͈͖r̽̾̈́͒͑e , 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, 我的脸, ",", 我的,,, 好的, 不, 不, 不, 不, 不, ZA̡͊͠͝LGΌISͮ̂҉̯͈͕̹̘̱**H̸̡̪̯ͨ͊̽̅̾̎Ȩ̶̧̨̬̩̱̹̭̯̾͛ͪ̈́̀́ͧ̾ͬ͘C̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ N̐Y̡**


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


版主注

此帖子被锁定, 以防止对其内容进行不适当的编辑。帖子看起来和应该看起来完全一样--内容没有问题。请不要为我们的注意而标记它。

第2个答案

虽然要求 regcex 解析任意_html 确实就像要求初学者编写操作系统一样, 但有时分析一组有限的已知 html 是合适的._

如果您有一小部分 HTML 页面, 您希望将数据从数据库中刮取, 然后将内容刮成数据库, 则 regecs 可能工作正常。 例如, 我最近想知道澳大利亚联邦代表的姓名、政党和地区, 我从议会网站上得到了这些名字、政党和地区。 这是一份有限的一次性工作。

雷克斯对我来说效果很好, 设置得非常快。

第3个答案

我认为这里的缺陷是Html 是 Chomsky 类型 2 语法 (上下文免费语法) , regex 是Chomsky 类型 3 语法 (常规语法)。由于类型 2 语法基本上比类型 3 语法更复杂 (请参阅 Chomsky 层次结构),因此在数学上不可能使用 regex 解析 xml。

但很多人会尝试, 有的甚至会声称成功--但直到别人发现错误, 把你完全搞砸。

第4个答案

别听这些家伙的如果你把任务分成更小的部分, 你完全可以用正则表达式解析无上下文语法。您可以使用按顺序执行以下操作的脚本生成正确的模式:

  1. 解决暂停问题。
  2. 把一个圆圈平方。
  3. 在 O (log n) 或更少的时间内解决旅行推销员问题。如果不止这些, 你的 RAM 就会用完, 发动机就会挂起。
  4. 该模式将是相当大的, 所以请确保你有一个算法, 无损压缩随机数据。
  5. 几乎就在那里--只要把整个事情除以零就可以了。很容易。

我自己还没有完全完成最后的部分, 但我知道我已经接近了。它不断抛出 CthulhuRlyehWgahnaglFhtagnException s 出于某种原因, 所以我要把它移植到 VB6 和使用 On Error Resume Next 。一旦我调查了刚刚在墙上打开的奇怪的门, 我就会用代码进行更新。嗯。

P. s. 皮埃尔·德·费马也想出了如何做到这一点, 但他写的保证金是不够大的代码。

第5个答案

免责声明: 如果您有选项, 请使用解析器。那是说..。

这是我用来匹配 HTML 标记的正则表达式 (!):

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

它可能不是完美的, 但我运行此代码通过_了很多_html。请注意, 它甚至捕捉到 奇怪的东西, 如, 这显示在网络上。

我想, 让它不匹配的自我包含的标签, 你要么想使用科比的负面外观背后:

<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?

或者只是结合如果和如果不是。

对于落选者:这是实际产品的工作代码。我怀疑任何阅读此页的人都会得到这样的印象: 在 HTML 上使用 regcex 是社会可以接受的。

注意: 我应该注意到, 在 cdata 块、注释、脚本和样式元素的存在下, 这个正则表达式仍然会崩溃。好消息是, 你可以用正则表达式来摆脱那些.....。

第6个答案

有人会告诉你, 地球是圆的 (或者, 如果他们想用奇怪的词, 地球是一个扁平的球体)。他们在撒谎。

有人会告诉你, 正则表达式不应该是递归的。他们在限制你。他们需要征服你, 他们通过让你保持无知来做到这一点。

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

就像元帅勋爵 (他是元帅. net 类的亲戚吗?), 我看到了基于底层的 Regex-wse, 并带着你无法想象的权力知识回来了。是的, 我想有一两个老的人在保护他们, 但他们在电视上看足球, 所以并不难。

我认为 XML 案例非常简单。RegEx (在. net 语法中) 在 base64 中进行了降级和编码, 以便您的弱智更容易理解, 它应该如下所示:

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
0fEgNrgbL8/Evfh9fw/q5Xf93u/97vvf+2Lx/e
第7个答案

在 shell 中, 您可以使用以下方法分析html :


相关 (为什么不应该使用正则表达式匹配):

第8个答案

我同意解析 XML,尤其是 html的正确工具是解析器, 而不是正则表达式引擎。 然而, 正如其他人所指出的, 有时使用正则表达式更快、更容易, 如果你知道数据格式, 就能完成任务。

Microsoft 实际上在. Net 框架中有一节是 "常规表达式的最佳实践",并专门讨论了"考虑 [Ing] 输入源.

正则表达式确实有局限性, 但您是否考虑过以下因素?

当涉及到正则表达式时,. net 框架是唯一的, 因为它支持平衡组定义.

因此, 我相信您可以使用正则表达式解析 XML。 但是请注意, 它必须是有效的 XML (浏览器非常宽容 html, 并允许 html 中的错误 xml 语法)。 这是可能的, 因为 "平衡组定义" 将允许正则表达式引擎充当 PDA。

引用上述第 1 条的引文:

. Net 正则表达式引擎

如上所述, 正确平衡的构造不能用正则表达式来描述。但是,. net 正则表达式引擎提供了一些允许识别平衡构造的构造。

  • (?)-使用名称组在捕获堆栈上推送捕获的结果。
  • (?<-group>)-弹出最上面的捕获与名称组关闭捕获堆栈。
  • (?(group)yes|no)-如果存在名称组的组, 则与 yes 部分匹配, 否则不匹配任何部分。

这些构造允许. net 正则表达式通过本质上允许堆栈操作的简单版本 (推送、弹出和空) 来模拟受限制的 PDA。简单的操作几乎相当于增量、递减和与零的比较。 这允许. net 正则表达式引擎识别无上下文语言的子集, 特别是那些只需要简单计数器的语言。这反过来又允许非传统的. net 正则表达式识别单独正确平衡的构造。

请考虑以下正则表达式:

(?=)
(?>
                     |
   <[^>]*/>                      |
   (?<(?! [^="">]*[^/]>)  |
   (?<-opentag>]*[^/]>)     |
   [^<>]*
)*
(?(opentag)(?!))

使用标志:

  • 辛斯林
  • Ignorepattern 白纹 (如果折叠正则表达式并删除所有空白, 则不需要)
  • 无知案例 (不需要)

正则表达式解释 (内联)

(?=) # match start with                                         # atomic group / don't backtrack (faster)
                    |          # match xml / html comment
   <[^>]*/>                     |          # self c
第9个答案

我建议在 PHP 中使用Querypath来解析 XML 和 html。 它基本上与 jQuery 的语法大同小异, 只是它在服务器端。

第10个答案

虽然不能用正则表达式解析 HTML 的答案是正确的, 但它们在这里并不适用。OP 只是想用正则表达式解析一个 HTML 标记, 这是可以用正则表达式来完成的。

不过, 建议的正则表达式是错误的:

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

如果你在正则表达式中添加了一些东西, 通过回溯它可以被迫匹配愚蠢 > 的东西 [^/] , 这样的事情, 太宽容了。另请注意, *[^/]* 这是多余的, 因为 [^/]* 也可以匹配空格。

我的建议是

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

在哪里(? is (in Perl regexes) the negative look-behind. It reads "a <, then="" a="" word,="" then="" anything="" that's="" not="" a="">, the last of which may not be a /, followed by >".

Note that this allows things like (just like the original regex), so if you want something more restrictive, you need to build a regex to match attribute pairs separated by spaces.

第11个答案

尝试:

<([^\s]+)(\s[^>]*?)?(?

它与您的相似, 但最后 > 一个不能在斜线之后, 也接受 h1

第12个答案

中国古代战略家、将军、哲学家孙子说:

据说, 如果你了解你的敌人, 了解自己, 你就能在没有一次损失的情况下赢得一百场战斗。 如果你只认识自己, 而不认识对手, 你可能赢, 也可能输。 如果你既不认识你自己, 也不认识你的敌人, 你就会永远危及你自己。

在这种情况下, 你的敌人是 HTML, 你要么是你自己或正则表达式。 你甚至可能是有不规则正则表达式的 perl。了解 HTML。 了解你自己。

我写了一个海口描述 HTML 的本质。

HTML has
complexity exceeding
regular language.

我还在 Perl 中创作了一个描述正则表达式的本质的海口。

The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>
第13个答案
foo


name' ;="" $dom="new" domdocument();="" $dom-=""?>loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}

输出:

string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"

基本上只需定义自关闭的元素节点名称, 将整个 html 字符串加载到 DOM 库中, 抓取所有元素, 循环并筛选出那些不自动关闭和操作的元素。

我相信你现在已经知道了, 你不应该为此目的使用正则式像。

第14个答案

我不知道你的确切需求, 但如果你也在使用. net, 你不能使用Html 敏捷包吗

节录:

它是一个. net 代码库, 允许您解析 "退出 web" HTML 文件。解析器对 "真实世界" 格式错误的 HTML 非常宽容。

第15个答案

您想要的第一个 > 没有前面的 / 。 请在这里查看有关如何执行此操作的详细信息。 这被称为负面的外表背后。

然而, 一个天真的实现, 这将 结束匹配在这个例子文件

你能提供更多关于你试图解决的问题的信息吗? 您是否以编程方式遍历标记?

第16个答案

W3C 以伪 regexp 形式解释分析:
W3C 链接

按照 var 链接 QName S , 并 Attribute 获得更清晰的图片。
在此基础上, 您可以创建一个相当不错的 regexp 来处理剥离标记之类的事情。

第17个答案

如果 PHP 需要此功能:

PHP dom 函数将无法正常工作, 除非它是正确的格式的 xml。无论它们对人类的使用有多好。

simplehtml是好的, 但我发现它有点错误, 它是相当沉重的内存 [将崩溃在大页面上。

我从来没有使用过查询路径, 所以不能评论它的有用性。

另一个尝试的是我的Domparser,它对资源非常轻松, 我已经快乐地使用了一段时间。简单的学习 & 强大的。

对于 Python 和 Java, 也发布了类似的链接。

对于落选者--我只是在 XML 解析器被证明经不起实际使用时才写下我的课。宗教下投票只是阻止有用的答案被张贴-保持事情的角度内的问题, 请。

第18个答案

以下是解决方案:

|>)/';

// a string to parse:
here
    and check out.
    title

    thanks.

    ';

// let's get the occurrences:
preg_match_all($pattern, $string, $matches, PREG_PATTERN_ORDER);

// print the result:
print_r($matches[0]);
?>

为了深入测试它, 我在字符串自动关闭标记中输入了, 如:


2.

3)

我还输入了标签:

  1. 一个属性
  2. 多个属性
  3. 值绑定到单引号双引号的属性
  4. 包含单引号的属性, 当分隔符是双引号时, 反之亦然
  5. "不漂亮" 属性, 在 "=" 符号之前、之后以及之前和之后都有空格。

如果你在上面的概念证明中发现了一些不工作的东西, 我可以分析代码来提高我的技能。

我忘记了用户的问题是避免分析自我关闭标记。 在这种情况下, 模式更简单, 变成:

$pattern = '/<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>/';

用户 @ridgerunner 注意到, 该模式不允许没有引号的属性没有值的属性。在这种情况下, 微调将为我们带来以下模式:

$pattern = '/<(\w+)(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\5\s*)?)*\s*>/';

了解模式

如果有人有兴趣了解更多关于该模式, 我提供一些行:

  1. 第一个子表达式 (\w +) 与标记名称匹配
  2. 第二个子表达式包含属性的模式。它由以下部分组成:
    1. 一个或多个空白 \ s +
    2. 属性的名称 (\w +)
    3. 零个或多个空白 \ s * (这是可能的, 也可能是不可能的, 在这里留下空白)
    4. "=" 符号
    5. 再次, 零或更多的空白
    6. 属性值的分隔符, 一个单引号或双引号 (' ")。在模式中, 单引号被转义, 因为它与 PHP 字符串分隔符重合。这个子表达式是用括号捕获的, 这样就可以再次引用它来分析属性的闭包, 这就是为什么它非常重要的原因。
    7. 属性的值,与几乎任何东西匹配: (. *?);在这个特定的语法中, 使用贪婪匹配(星号后面的问号) RegExp 引擎启用了一个类似于 "向前看" 的运算符, 它匹配这个子表达式后面的任何东西
    8. 这里带来的乐趣是: \ 4 部分是一个反向引用运算符, 它指的是之前在模式中定义的子表达式, 在这种情况下, 我指的是第四个子表达式, 这是找到的第一个属性分隔符
    9. 零个或多个空白 \ s *
    10. 属性子表达式在这里结束, 并指定零个或多个可能出现的事件, 由星号给出。
  3. 然后, 由于标记可能以 ">" 符号之前的空白结束, 因此零或多个空格与 \ s * 子模式匹配。
  4. 要匹配的标记可能以一个简单的 ">" 符号或可能的 XHTML 闭包结束, 该闭包使用之前的斜杠: (/> >)。当然, 斜杠是转义的, 因为它与正则表达式分隔符重合。

小提示: 为了更好地分析此代码, 它是必要的查看生成的源代码, 因为我没有提供任何 HTML 特殊字符逃避

第19个答案

我以前使用过一个名为Htmparser的开源工具。它被设计为以各种方式解析 HTML, 并很好地达到了目的。它可以将 HTML 解析为不同的树状物, 并且您可以轻松地使用其 API 从节点中获取属性。看看, 看看这是否能对你有帮助。

第20个答案

每当我需要从 HTML 文档中快速提取某些内容时, 我都会使用 Tidi 将其转换为 XML, 然后使用 XPath 或 XSLT 来获取所需的内容。 在您的情况下, 类似这样的东西:

//p/a[@href='foo']
第21个答案

我喜欢用正则表达式解析 HTML。我不会试图解析被故意破坏的白痴 HTML。此代码是我的主要解析器 (Perl 版):

$_ = join "",; tr/\n\r \t/ /s; s//>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print

它被称为 html 拆分, 将 HTML 拆分为一行, 每行上都有一个标记或文本块。 然后, 可以使用其他文本工具和脚本 (如grepsed、perl 等) 进一步处理这些行。我甚至都不是在开玩笑:)享受。

这是很简单的, 重新设置我的每一个懒散的一切-第一 Perl 脚本到一个很好的流媒体的东西, 如果你想处理巨大的网页。但这并不是真正必要的。

我打赌我会因此而被否决的。

HTML 拆分


与我的期望相反, 这得到了一些上升的选票, 所以我会建议一些更好的正则表达式:

/(<.*?>|[^<]+)\s* #="" get="" tags="" and="" text="" \w+)="(.*?)" #="" get="" attibutes="">

它们适用于 XML/XHTML。

与微小的变化, 它可以应付凌乱的 HTML..。或先转换 HTML-> XHTML。


编写正则表达式的最佳方法是lex / yacc样式, 而不是不透明的单行线或注释的多行怪物。我没有这样做, 但我这些人几乎不需要它。

第22个答案

这里是一个基于 php 的解析器, 它使用一些不虔诚的正则表达式来解析 html。作为这个项目的作者, 我可以告诉你, 用正则表达式解析 HTML 是可能的, 但效率并不高。如果你需要一个服务器端解决方案 (就像我为我的Wp-Typography WordPress 插件所做的那样), 这很管用。

第23个答案

这里有一些很好的正则表达式, 可以用 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/(.*?)<\ re="">/\[code]$2\[\/code]/sgmi;
}

$html =~ s/\n//gi;
$html =~ s/\r\r//gi;
$html =~ s/$baseurl//gi;
$html =~ s/(.*?)<\ [1-7]="">/\n\[b]$2\[\/b]\n/sgmi;
$html =~ s//\n\n/gi;
$html =~ s//\n/gi;
$html =~ s/(.*?)<\ extarea="">/\[code]$2\[\/code]/sgmi;
$html =~ s/(.*?)<\>/\[b]$1\[\/b]/gi;
$html =~ s/(.*?)<\>/\[i]$1\[\/i]/gi;
$html =~ s/(.*?)<\>/\[u]$1\[\/u]/gi;
$html =~ s/(.*?)<\ m="">/\[i]$1\[\/i]/gi;
$html =~ s/(.*?)<\ trong="">/\[b]$1\[\/b]/gi;
$html =~ s/(.*?)<\ ite="">/\[i]$1\[\/i]/gi;
$html =~ s/(.*?)<\ ont="">/\[color=$1]$2\[\/color]/sgmi;
$html =~ s/(.*?)<\ ont="">/\[color=$1]$2\[\/color]/sgmi;
$html =~ s///gi;
$html =~ s/(.*?)<\ i="">/\[\*]$2/gi;
$html =~ s//\[list]/gi;
$html =~ s/<\ l="">/\[\/list]/gi;
$html =~ s//\n/gi;
$html =~ s/<\ iv="">/\n/gi;
$html =~ s// /gi;
$html =~ s//\n/gi;

$html =~ s//\[img]$baseurl\/$2\[\/img]/gi;
$html =~ s/(.*?)<\>/\[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/(.*?)<\ ead="">//sgmi;
$html =~ s/(.*?)<\ bject="">//sgmi;
$html =~ s/(.*?)<\ cript="">//sgmi;
$html =~ s/(.*?)<\ tyle="">//sgmi;
$html =~ s/(.*?)<\ itle="">//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;
</(?:[^></\>
第24个答案

关于 regexp 方法解析 (x) HTML 的问题, 所有谈到某些限制的人的答案是: 你没有受过足够的训练来控制这种强大武器的力量, 因为这里没有人谈论归。

一位 regexpo 无关的同事通知我这次讨论, 这肯定不是网络上关于这个古老而热门的话题的第一个。

读了一些帖子后, 我做的第一件事就是找 "?此线程中的 R "字符串。二是搜索有关 "递归" 的信息。
不, 圣牛, 没有找到匹配。
由于没有人提到解析器的主要机制, 我很快就意识到没有人明白这一点。

如果 (x) HTML 解析器需要递归, 则没有递归的 RegExp 解析器是不够的。这是一个简单的构造。

RegExp 的黑色艺术很难掌握, 所以也许还有更多的可能性, 我们在尝试和测试我们的个人解决方案, 以捕获整个网络在一只手..。嗯, 我很确定:)

下面是神奇的模式:

$pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<><\!\-\-.*?\-\->)|(?R))*)<\ \1[\s]*="">))/s";

就试试吧。
它是作为 PHP 字符串编写的, 因此 "s" 修饰符使类包含换行符。
下面是我在 1 月份编写的 PHP 手册的示例说明:参考

(请注意, 在该注释中, 我错误地使用了 "m" 修饰符; 它应该被擦除, 尽管它被 RegExp 引擎丢弃, 因为没有使用 ^ 或 $ 锚定)。

现在, 我们可以从更明智的角度来谈论这种方法的局限性:

  1. 根据 RegExp 引擎的具体实现, 递归可能对分析的嵌套模式的数量有限制, 但这取决于所使用的语言
  2. 虽然损坏的 (x) HTML 不会导致严重的错误, 它没有被消毒

无论如何, 它只是一个 RegExp 模式, 但它揭示了开发许多强大的实现的可能性。
我编写此模式是为了为我在框架中构建的模板引擎的递归下降解析器提供动力, 无论是在执行时间还是在内存使用中, 性能都非常出色 (与使用相同语法的其他模板引擎无关)。

第25个答案

正如许多人已经指出的, HTML 不是一种常规语言, 它可能会使解析变得非常困难。我的解决方法是使用整洁的程序将其转换为常规语言, 然后使用 XML 解析器来使用结果。这里面有很多好的选择。我的程序是使用带有 jtidy库的 jtidy 编写的, 用于将 html 转换为 xpath, 然后 jaxen 将 xpath 转换为结果。

第26个答案
<\s*(\w+)[^>]*>

这些部分解释说:

: 起始字符

\s*: 它可能在标记名称之前有空格 (丑陋但可能)。

(\w+): 标签可以包含字母和数字 (h1)。嗯, \w 也匹配 "_", 但它不会伤害我想。如果好奇使用 ([A-za-Z0-9]+) 代替。

[^/>]*: 任何东西, 除了 > / 和关闭>

>: 关闭>

无关

而对于那些低估了正则表达式的人来说, 他们只像规则语言一样强大:

一个不规则的,甚至没有上下文的 n ban, 可以与匹配^(a+)b\1b\1$

反向引用ftw!

第27个答案

在我看来, 你是想在没有 "/" 的情况下匹配标签。试试这个:

<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?
第28个答案

如果你只是想找到这些标签 (没有解析的野心), 试试这个正则表达式:

/<[^ *?="">/g

我在 30 秒内就写好了, 并在这里测试: http://gskinner.com/RegExr/

它与您提到的标记类型匹配, 而忽略您说要忽略的类型。

第29个答案

的确, 在编程时, 在处理 HTML 时通常最好使用专用解析器和 Api, 而不是正则表达式, 特别是在准确性至关重要的情况下 (例如, 如果您的处理可能具有安全影响)。但是, 我并不认为 xml 样式的标记永远不应该用正则表达式处理, 这种观点是教条式的观点。在某些情况下, 正则表达式是作业的一个很好的工具, 例如在文本编辑器中进行一次性编辑、修复损坏的 XML 文件或处理看起来像但不完全是 XML 的文件格式时。有一些问题需要注意, 但它们不是不可克服的, 甚至不一定相关。

像这样简单的正则表达式通常 <([^>"']|"[^"]*"|'[^']*')*> 足够好, 在我刚才提到的情况下。这是一个简单的解决方案, 所有的事情都考虑到了, 但它确实正确地允许 > 属性值中的未编码符号。如果你正在寻找, 例如, table 一个标签, 你可以调整它作为 "']|"[^"]*"|'[^']*')*>

为了让人们了解更 "高级" 的 HTML 正则表达式会是什么样子, 下面的操作是模拟真实世界的浏览器行为和 HTML5 解析算法方面的工作:

/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)

以下与 XML 标记的一个相当严格的定义相匹配 (尽管它没有考虑到 XML 名称中允许的完整 Unicode 字符集):

<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s* |/([_:a-z][-.:\w]*)\s*)="">

诚然, 这些并没有考虑到周围的上下文和一些边缘的情况下, 但即使这样的事情可以处理, 如果你真的想 (例如, 通过搜索之间的匹配另一个正则表达式)。

在一天结束时, 使用最适合工作的工具, 即使在该工具恰好是正则表达式的情况下也是如此。

第30个答案

虽然为此目的使用正则表达式是不合适和有效的, 但有时正则表达式为简单的匹配问题提供快速的解决方案, 在我看来, 在琐碎的工作中使用正则表达式并不是那么可怕的事情。

有一个明确的博客文章匹配最里面的 html 元素写的史蒂芬莱维森。

相关问题

RegEx 匹配打开的标记, 但 XHTML 独立标记除外 PHP 邮件功能不能完成电子邮件的发送 如何从最后一行中的元素中删除边框? 根据字母计数检索括号缩写的定义 如何找到双字母并用三个字母替换?