我一直在浏览正则表达式的东西,并认为我们有一个数组,其中html标签存储为字符串..
比如array=["</div>,"</a>", "<div id='test'>", "<a href='http://test/new.html'>", "</a>", "</div>", "<span style='color:#ffffff;'>"]
如果我们一个接一个地浏览数组,
如果我们想要检测完整的代码和不完整的代码,例如,<div>
会被打开,</div>
之后就会关闭...所以这两个代码都在完整的代码下...... { {1}}已打开,但从未关闭,因此它位于不完整的打开标记下,第一个位置的<span>
已关闭,因此它位于不完整的已关闭标记下。
可以使用JavaScript完成吗?
答案 0 :(得分:4)
这对于教授Stack数据类型的实用程序来说听起来是一个很大的问题。在Javascript中,所有数组都使用堆栈函数,如here所示。
你是怎么做到的?
从空堆栈开始。 按顺序遍历数组的元素。对于每个项目:
最后,当您完成数组后,检查堆栈是否为空。
例如:
[<div>, <a>, <span>, </span>, </div>, </a>]
会失败。按div
,按a
,按span
。流行span
。弹出a
,与div
应该看起来像
[<div>, <a>, <span>, </span>, </a>, </div>]
哪个会通过,因为在方法结束时堆栈将为空(长度为0)。
编辑:如果您想在单独的步骤中使用正则表达式:
确定标签是否已打开:
tag.match(/<\//) == null
检查标记是否包含字符<\
从标记中获取内容:
var tagContent = tag.match(/\w+/)[0];
这会抓取一组单词字符。具体来说,第一组。它应该只是获取标记名称并忽略任何属性,因为空格将结束表达式。匹配总是返回一个数组,如果你全局匹配(有多个匹配),所以得到返回数组的第0个索引来获取值。
比较两个标签:
tag1Content == tag2Content
这严重不需要正则表达式。
答案 1 :(得分:0)
var stack=new Array();
var stackCount = 0;
var array=["</div>","<div id='test'>", "<a href='http://test/new.html'>", "</a>", "</div>", "<span style='color:#ffffff;'>"];
for(var k=0;k<array.length;k++)
{
alert("Eleemnt Selected:" + array[k]);
if(stackCount==0)
{
if(array[k].match(/<\//)==null)
{
stack.push(array[k]);
stackCount++;
alert("Pushed in to the stack as stack is empty" + stack);
}
else
{
alert("Ignored as it is a tag containing slash");
}
}
else
{
var tagType1=array[k].match(/<\//);
var tagType2=stack[0].match(/<\//);
var cmpTag1=array[k].match(/\w+/);
var cmpTag2=stack[0].match(/\w+/);
//alert("Tag Type : Array element :" +tagType1 + "Stack element : " + tagType2 + "Tag Name: Array element : " + cmpTag1 + "Stack Element : " +cmpTag2);
if(cmpTag1!=cmpTag2 && tagType1!=tagType2)
{
stack.pop();
stackCount--;
alert("same Tags, so popped out from the stack" + stack);
}
else
{
stack.push(array[k]);
stackCount++;
alert("Pushed in to the stack as items compared are different");
}
}
}
我已经发布了我的答案......我试过了,这就是我...我的任何反馈或改进?我担心这个部分,因为它是一个封闭的标签,它应该弹出..对吗??