0

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

如果我们一个一个地遍历数组,

如果我们想检测完整的标签和不完整的标签,例如,它<div>是打开的,然后</div>在位置上关闭..所以这两个属于完整的标签......<span>是打开的,但从不关闭,所以它属于不完整的打开标签,</div>在第一个位置是封闭的,所以它属于不完整的封闭标签。

这可以使用 JavaScript 完成吗?

4

2 回答 2

4

对于教授 Stack 数据类型的实用程序来说,这听起来像是一个很大的问题。在 Javascript 中,所有数组都使用堆栈函数,如此处所示

你怎么做呢?

从一个空堆栈开始。按顺序循环遍历数组的元素。对于每个项目:

  • 如果它是一个打开的标签,把它推到你的堆栈上。
  • 如果它是关闭标签,则从堆栈中弹出顶部项目
    • 检查两个标签是否匹配。(您必须关闭最近打开的项目,不是吗?)
    • 如果没有,失败

最后,当你完成你的数组时,检查堆栈是否为空。

  • 如果不是,则不是每个标签都已关闭。失败
  • 如果是这样,成功!

例如:

[<div>, <a>, <span>, </span>, </div>, </a>]

将失败。推div,推a,推span。流行音乐span。Pop a, 不匹配div

它应该看起来像

[<div>, <a>, <span>, </span>, </a>, </div>]

这将通过,因为在方法结束时堆栈将为空(长度为 0)。


编辑:如果您想在单独的步骤中使用正则表达式:

要确定标签是否打开:

tag.match(/<\//) == null

这会检查标签是否包含字符<\

要从标签中获取内容:

var tagContent = tag.match(/\w+/)[0];

这会抓取一组单词字符。具体来说,第一组。它应该只获取标签名称并忽略任何属性,因为空格将结束表达式。匹配总是返回一个数组,以防你全局匹配(会有多个匹配),所以获取返回数组的第 0 个索引来获取值。

比较两个标签:

tag1Content == tag2Content

这严重不需要正则表达式。

于 2012-08-08T13:25:08.313 回答
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");
                        }
                        }



        }

Ive posted my answer...I tried and this is where I am... any feedbacks or improvemnts from your side??? I m concerned about the part, , since it is a closed tag, it should pop out.. right??

于 2012-08-09T05:10:51.580 回答