我正在尝试编写一个正则表达式,它将在代码编辑器(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>
。最初的语法错误不是信息性的,但在大多数情况下是正确的;我的例子是异常。如果正则表达式发现此异常,我将尝试向语法解析器传递一条新消息,以覆盖原始消息。
发布于 2015-11-25 02:47:02
有时候把问题分解一下会更好。
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>
怎么办”的情况,但它确实提供了一个基本思路,说明如何在不使用正则表达式的情况下将问题分解为更简单的部分。
发布于 2015-11-25 03:57:02
搜索后面跟着任意数量的字符的<p>
([^]
指的是任何不是空的字符,这允许我们还可以捕获换行符),后面不跟</p>
,最后跟<h[1-6]>
。
/<p>(?:[^](?!<\/p>))*<h[1-6]>/gi
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>"] }
.as-console-wrapper { max-height: 100% !important; min-height: 100% !important; }
发布于 2015-11-25 03:46:42
我得出的结论是,使用正则表达式来查找错误将把一个问题变成两个问题。
因此,我认为更好的方法是进行非常简单的树解析。“穷人的HTML解析器”,如果你愿意的话。
使用一个简单的正则表达式来简单地查找HTML中的所有标记,并按找到它们的相同顺序将它们放入列表中。忽略标签之间的文本节点。
然后,按顺序遍历列表,在标签上保持一个连续的计数。获取<p>
标记时递增P计数器,获取</p>
标记时递减P计数器。当到达<h1>
(等)时,递增H计数器和H计数器标签,在结束标签上递减。
如果H计数器> 0,而P计数器>0,那就是你的错误。
https://stackoverflow.com/questions/33901362
复制相似问题