JavaScript正则表达式:查找不包含</ p>的字符串

Dan*_*her 6 html javascript regex

我正在尝试编写一个在代码编辑器(Khan Live Editor)中找到一串HTML标签的正则表达式,并给出以下错误:

"You can't put <h1.. 2.. 3..> inside <p> elements."

这是我想要匹配的字符串:

<p> ... <h1>
Run Code Online (Sandbox Code Playgroud)

这是我不想匹配的字符串:

<p> ... </p><h1>
Run Code Online (Sandbox Code Playgroud)

相反,预期的行为是在这种情况下出现另一条错误消息.

所以在英语中我想要一个字符串;
- 以 - 开头<p>
- 结束<h1>但是
- 不包含</p>.

如果我不关心a的存在,这很容易使这项工作</p>.我的表情看起来像这样,/<p>.*<h[1-6]>/它工作正常.但我需要确保</p>不在<p><h1>标签之间(或任何<h#>标签,因此<h[1-6]>).


我在这里尝试了很多其他帖子的不同表达方式:

正则表达式匹配不包含单词的行?

从中我尝试过: <p>^((?!<\/p>).)*$</h1>

正则表达式字符串不包含子字符串

从中我尝试过: /^<p>(?!<\/p>)<h1>$/

正则表达式,不包含某些字符串

此链接建议: aa([^a] | a[^a])aa

这在我的情况下不起作用,因为我需要特定的字符串" </p>"而不仅仅是它的字符,因为它们之间可能还有其他标签<p> ... <h1>.


我真的很难过.我试过的正则表达式看起来应该有用......任何想法我会如何使这个工作?也许我正在实施其他帖子的建议错误?

在此先感谢您的帮助.

编辑:

要回答为什么我需要这样做:

问题是这<p><h1></h1></p>是一个语法错误,因为h1关闭第一个<p>并且有一个不匹配的</p>.原始语法错误不提供信息,但在大多数情况下它是正确的; 我的例子是例外.我试图通过语法分析器传递新消息,以便在正则表达式发现此异常时覆盖原始消息.

Nie*_*sol 6

有时候打破问题会更好.

var str = "YOUR INPUT HERE";
str = str.substr(str.indexOf("<p>"));
str = str.substr(0,str.lastIndexOf("<h1>"));
if( str.indexOf("</p>") > -1) {
    // there is a <p>...</p>...<h1>
}
else {
    // there isn't
}
Run Code Online (Sandbox Code Playgroud)

这段代码不能很好地处理"如果没有<p>开始"的情况,但它确实提供了如何在不使用正则表达式的情况下将问题分解为更简单的部分的基本概念.

  • 如果可以在没有正则表达式的情况下完成(不增加太多复杂性),那么就应该这样做.+1 (3认同)

Plu*_*uto 2

您的第一个正则表达式很接近,但需要删除^$字符。如果您需要跨换行符匹配,您应该使用[/s/S]而不是..

\n\n

这是最终的正则表达式:<p>(?:(?!<\\/p>)[\\s\\S])*<h[1-6]>

\n\n

然而,在段落元素中使用标题标签 ( <h1>- ) 是完全合法的。<h6>它们只是被视为同级元素,段落元素在标题元素开始的地方结束。

\n\n
\n

如果p元素后面紧跟有addressarticleasideblockquotedirdivdlfieldsetfooterformh1h2h3h4 ,则p元素\xe2\x80 \ x99s 结束标记可以被省略、h5h6headerhrmenunavolppresectiontableul元素,或者如果父元素中没有更多内容并且父元素不是a

\n
\n\n

http://www.w3.org/TR/html-markup/p.html

\n