首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript正则表达式:查找不包含</p>的字符串

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

Stack Overflow用户
提问于 2015-11-25 02:41:01
回答 4查看 1.5K关注 0票数 6

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

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

这是我尝试匹配的字符串:

代码语言:javascript
复制
<p> ... <h1>

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

代码语言:javascript
复制
<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>。最初的语法错误不是信息性的,但在大多数情况下是正确的;我的例子是异常。如果正则表达式发现此异常,我将尝试向语法解析器传递一条新消息,以覆盖原始消息。

EN

回答 4

Stack Overflow用户

发布于 2015-11-25 02:47:02

有时候把问题分解一下会更好。

代码语言:javascript
复制
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
}

这段代码不能很好地处理“如果一开始就没有<p>怎么办”的情况,但它确实提供了一个基本思路,说明如何在不使用正则表达式的情况下将问题分解为更简单的部分。

票数 6
EN

Stack Overflow用户

发布于 2015-11-25 03:57:02

搜索后面跟着任意数量的字符的<p> ([^]指的是任何不是空的字符,这允许我们还可以捕获换行符),后面不跟</p>,最后跟<h[1-6]>

代码语言:javascript
复制
/<p>(?:[^](?!<\/p>))*<h[1-6]>/gi

RegEx101 Test Case

代码语言:javascript
复制
const strings = [ '<p> ... <h1>', '<p> ... </p><h1>', '<P> Hello <h1>', '<p></p><h1>',
                  '<p><h1>' ];

const regex = /<p>(?:(?!<\/p>)[^])*<h[1-6]>/gi;

const test = input => ({ input, test: regex.test(input), matches: input.match(regex) });

for(let input of strings) console.log(JSON.stringify(test(input)));

// { "input": "<p> ... <h1>",     "test": true,  "matches": ["<p> ... <h1>"]   }
// { "input": "<p> ... </p><h1>", "test": false, "matches": null               }
// { "input": "<P> Hello <h1>",   "test": true,  "matches": ["<P> Hello <h1>"] }
// { "input": "<p></p><h1>",      "test": false, "matches": null               }
// { "input": "<p><h1>",          "test": true,  "matches": ["<p><h1>"]        }
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; min-height: 100% !important; }

票数 3
EN

Stack Overflow用户

发布于 2015-11-25 03:46:42

我得出的结论是,使用正则表达式来查找错误将把一个问题变成两个问题。

因此,我认为更好的方法是进行非常简单的树解析。“穷人的HTML解析器”,如果你愿意的话。

使用一个简单的正则表达式来简单地查找HTML中的所有标记,并按找到它们的相同顺序将它们放入列表中。忽略标签之间的文本节点。

然后,按顺序遍历列表,在标签上保持一个连续的计数。获取<p>标记时递增P计数器,获取</p>标记时递减P计数器。当到达<h1> (等)时,递增H计数器和H计数器标签,在结束标签上递减。

如果H计数器> 0,而P计数器>0,那就是你的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33901362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档