【问题标题】:Regex for an open SGML node that contains <p> , </p>, and <br /> tags包含 <p> 、 </p> 和 <br /> 标签的开放 SGML 节点的正则表达式
【发布时间】:2013-02-06 20:45:47
【问题描述】:

我有一些 SGML,我正试图通过在开始标签上添加结束标签来清理它们。现在,文档的结构如下:

<CAT>
<NAME>Daniel
<COLOR>White
<DESC>Daniel is a white cat <p>He was born in July</p><br />He's super cute.<p><br />He does not have any siblings.
<COUNTRY>USA
</CAT>

到目前为止,我可以使用以下正则表达式匹配一个打开的标记并捕获内容作为一个组: <NAME>([^\\<]+)[^<] 如果内容区域内没有任何&lt;p&gt;&lt;/p&gt;&lt;br /&gt; 元素。

但如果我这样做 <DESC>([^\\<]+)[^<],模式匹配会在第一个 &lt;p&gt; 之前停止

我之所以使用&lt; 作为模式的结尾是因为所有其他打开的节点都没有停止匹配的 html 元素

如何创建一个匹配包含&lt;p&gt;&lt;/p&gt;&lt;br /&gt; 并在&lt;COUNTRY&gt; 节点之前结束的&lt;DESC&gt; 节点的正则表达式?

【问题讨论】:

  • HTML / SGML 不适合使用正则表达式进行解析。
  • 如果不编写 DTD,我似乎找不到不同的方法,所以我只是尝试关闭打开的标签并使用实际的 XML 解析器将其解析为 XML。不过,我愿意接受建议和资源。
  • 如果你有&lt;br/&gt;,你就没有SGML。 SGML 不允许自闭标签。
  • @DanielHaley ISO 8879 技术勘误 2 如果在 SHORTTAG 开始标签选项中声明了 NETENABL IMMEDNET 或 NETENABL ALL,则允许自闭合标签。见en.wikipedia.org/wiki/Standard_Generalized_Markup_Language#NET

标签: html xml regex sgml


【解决方案1】:

这个怎么样:

<DESC>((?:</?p>|<br />|[^\\<])+)

这允许这三个标签匹配并在不属于这三个标签之一的下一个&lt; 处停止。

顺便问一下,为什么不允许反斜杠作为有效字符?

【讨论】:

  • @user1352544:小更新,我删除了结尾的[^&lt;] - 这不是必需的,如果&lt;br /&gt; 标记直接位于下一个&lt;COUNTRY&gt; 标记之前,它可能会破坏正则表达式。
  • 我不确定反斜杠的问题。我很确定我可以允许这些,是 &lt;DESC&gt;((?:&lt;/?p&gt;|&lt;br /&gt;|[^&lt;])+) 代替吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多