【发布时间】:2016-02-27 08:22:34
【问题描述】:
我正在尝试编写一个正则表达式,它将在代码编辑器 (Khan Live Editor) 中找到一串 HTML 标记并给出以下错误:
"You can't put <h1.. 2.. 3..> inside <p> elements."
这是我要匹配的字符串:
<p> ... <h1>
这是我不想匹配的字符串:
<p> ... </p><h1>
相反,预期的行为是在这种情况下出现另一条错误消息。
所以在英语中我想要一个字符串;
- 以 <p> 和
开头
- 以<h1> 结尾,但
- 不包含</p>。
如果我不关心</p> 的存在,这很容易完成。我的表情看起来像这样,/<p>.*<h[1-6]>/,效果很好。但我需要确保</p> 不在<p> 和<h1> 标签之间(或任何<h#> 标签,因此是<h[1-6]>)。
我在这里的其他帖子中尝试了很多不同的表达方式:
Regular expression to match a line that doesn't contain a word?
我尝试过:<p>^((?!<\/p>).)*$</h1>
regex string does not contain substring
我尝试过:/^<p>(?!<\/p>)<h1>$/
Regular expression that doesn't contain certain string
此链接建议:aa([^a] | a[^a])aa
这在我的情况下不起作用,因为我需要特定的字符串“</p>”而不仅仅是它的字符,因为<p> ... <h1> 之间可能还有其他标签。
我真的被难住了。我尝试过的正则表达式似乎应该工作......知道我将如何使其工作吗?也许我错误地执行了其他帖子的建议?
提前感谢您的帮助。
编辑:
回答为什么我需要这样做:
问题在于<p><h1></h1></p> 是一个语法错误,因为h1 关闭了第一个<p>,并且有一个不匹配的</p>。原始语法错误没有提供信息,但在大多数情况下是正确的;我的例子是个例外。如果正则表达式发现此异常,我正在尝试向语法解析器传递一条新消息以覆盖原始消息。
【问题讨论】:
-
没错。所以问题是
<p><h1></h1></p>是一个语法错误,因为h1关闭了第一个<p>并且有一个不匹配的</p>。原始语法错误没有提供信息,但在大多数情况下是正确的;我的例子是个例外。如果正则表达式发现此异常,我正在尝试向语法解析器传递一条新消息以覆盖原始消息。 -
这与您的正则表达式问题无关,但在显式 之前包含
、
等的 html 内容实际上是正确且正确的,在 HTML5(有这个流内容规则)中,
是完全可选的。例如:<p>Paragraph 1.<p>Paragraph 2.<h2>Heading</h2><p>Paragraph 3.是完全有效的 HTML5,可以故意这样创作。 -
我们是否应该假设标签中没有属性或空格?
-
@AlanMcBee 是的,没错。
-
@DanFletcher 你说 RegEx 是你唯一的选择。但是,您可以欺骗您的验证器并从参数列表中的 IIFE 传递 RegEx,并利用 Niet the Dark Absol 的代码。请check a fiddle.
标签: javascript html regex