正则表达式来比较html标签内的变量

时间:2012-08-08 13:18:29

标签: javascript regex arrays

我一直在浏览正则表达式的东西,并认为我们有一个数组,其中html标签存储为字符串.. 比如array=["</div>,"</a>", "<div id='test'>", "<a href='http://test/new.html'>", "</a>", "</div>", "<span style='color:#ffffff;'>"]

如果我们一个接一个地浏览数组,

如果我们想要检测完整的代码和不完整的代码,例如,<div>会被打开,</div>之后就会关闭...所以这两个代码都在完整的代码下...... { {1}}已打开,但从未关闭,因此它位于不完整的打开标记下,第一个位置的<span>已关闭,因此它位于不完整的已关闭标记下。

可以使用JavaScript完成吗?

2 个答案:

答案 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");
                        }
                        }



        }

我已经发布了我的答案......我试过了,这就是我...我的任何反馈或改进?我担心这个部分,因为它是一个封闭的标签,它应该弹出..对吗??