我可以使用正则表达式安全地替换 HTML 中的“<ul>”标签吗?

Can I safely replace "<ul>" tags within HTML using regexes?

我正在尝试解决 ,其中用户粘贴我们必须处理的无效 HTML,格式为 <ol><ul><li>item</li></ul></ol>。我们目前正在使用 lxml 进行解析。在合法的 HTML 中,<ol> 不能有 <ul> 的(直接)子代(它必须在 <li> 中)所以 lxml 关闭 ol 标签过早尝试“修复”HTML,生成 <div><ol/><ul><li>item</li></ul>.

用户粘贴的文本也可能无效 XML(例如,裸 <br> 标签),因此我们不能将其解析为 XML.

因此,我们不能将其解析为 HTML 或 XML,因为它可能无效。

为了使无效 HTML 的某些(常见)情况变为有效 HTML,我们能否将所有 <ul> 标签替换为 <ol>使用正则表达式的标签?

如果我使用 lxml 来解析 <ol><ol><li>item</li></ol></ol>,输出看起来不错(不会很快关闭标签)。

但是,我不想破坏实际用户键入的文本,我想知道是否存在我没​​有想到的极端情况(例如 [=25 中的“<ul>” =] 标签或其他一些实际上不是标签的疯狂东西,尽管我已经测试了这种特殊情况)。

是的,它会将未编号列表更改为编号列表。我没意见。

是的,我已阅读this fun regex answer

一般来说,不能保证 'non-edge case' 使用 HTML 和正则表达式进行转换。 HTML 比 XML 更具有直接文本替换看起来像标签的问题的规则。

以下文本 validates as HTML using w3c.org validation checker 没有任何警告。

<!DOCTYPE html>
<html lang="en">
<head>
  <title><!--<ul>--></title>
  <style lang="css">s {content: "<ul>";}</style>
  <script>"<ul>"</script>
</head>
<body data-ul="<ul>"></body>
</html>

除此之外,使用一些正则表达式试探法可能会解决手头的问题 - 至少在合理的范围内。不尝试应用任何验证或 DOM/tree 构建的流式 HTML 令牌解析器也可能对初始替换阶段有用。