匹配HTML中没有标记内容的文本

时间:2009-04-07 13:12:10

标签: javascript html regex

我正在寻找Javascript的正则表达式来搜索HTML中的文本(例如“span”)。

例:
  

<div>Lorem span Ipsum dor<a href="blabla">la BLA la</a> dsad <span>2</span> ... </div>

但只应匹配“Lorem”之后的“span”,而不是<span>标签。
对于第二个示例,如果我们搜索“bla”,则只应匹配粗体文本。

编辑:

HTML由innerHTML获取,匹配将被<span class="x">$text</span>包围,然后被重写为此节点的innerHTML,所有这些都没有 kill 其他标记。

EDIT2和我的解决方案:

我编写了自己的搜索,它通过char搜索char,包含缓存和标记。

感谢帮助人员!

8 个答案:

答案 0 :(得分:2)

您可以使用dom方法处理每个文本节点。

此方法获取第一个参数的父节点并循环遍历其所有子节点, 使用作为第二个参数传递的函数处理文本节点。 该函数用于操作测试节点的数据, 例如,在“突出显示”的范围内查找或替换或删除或包装找到的文本。

您可以仅使用第一个参数调用该函数,它将返回一个数组 文本节点,然后您可以使用该数组来操纵文本 - 在这种情况下,数组项是每个节点,并有数据,父母和兄弟姐妹。

document.deepText= function(hoo, fun){
    var A= [], tem;
    if(hoo){
        hoo= hoo.firstChild;
        while(hoo!= null){
            if(hoo.nodeType== 3){
                if(fun){
                    if((tem= fun(hoo))!== undefined){
                       A[A.length]= tem;
                    }
                }
                else A[A.length]= hoo;
            }
            else A= A.concat(arguments.callee(hoo, fun));
            hoo= hoo.nextSibling;
        }
    }
    return A;
}

//测试用例

function ucwords(pa, rx){
    var f= function(node){
        var t= node.data;
        if(t && t.search(rx)!=-1){
            node.data= t.replace(rx,function(w){return w.toUpperCase()});
            return node;
        }
        return undefined;
    }
    return document.deepText(pa, f);
}

<强> ucwords(document.body的,/ \ bspan \ B / IG)

答案 1 :(得分:1)

如果你在DOM元素中有HTML,你可以使用textContent / innerText来获取文本(没有任何HTML标签):

var getText = function(el) {
    return el.textContent || el.innerText;
};
// usage:
// <div id="myElement"><span>Lorem</span> ipsum <em>dolor<em></div>
alert(getText(document.getElementById('myElement'))); // "Lorem ipsum dolor"

答案 2 :(得分:1)

(?<!\<|/)span

这应该给出非标签的所有跨度出现。希望这有助于至少一点:)

说明:找到之前的每个span出现</

答案 3 :(得分:1)

使用jQuery可以轻松完成您想要做的事情:

  $("span:contains('blah'))

如果要进行正则表达式匹配,请执行上一个堆栈溢出示例中的操作:

jQuery Regular Expressions

要获得更优雅的解决方案,请创建custom selector

答案 4 :(得分:1)

/span(?=[^>]*<)/

换句话说,从“span”一词的末尾向前看,在下一个开口角括号之前没有关闭角括号,所以我们不能在标签内。据推测,引用属性值可以包含结束尖括号,但我从未见过它。但是,为了涵盖这种可能性,你可以使用这个正则表达式:

/span(?=(?:[^>"']+|"[^"]*"|'[^']*')*<)/

答案 5 :(得分:0)

如果我理解正确,您需要搜索单词,但只能搜索不属于HTML标记的单词。

我没有给你一个确切的答案,但我用来开发正则表达式的一些工具是这个网站:http://www.regular-expressions.info/和这个程序:http://www.radsoftware.com.au/regexdesigner/

答案 6 :(得分:0)

在一般情况下,这可能是不可能的,因为您需要计算正则表达式无法实现的开始和结束标记。

Regex不是处理XML的智能解决方案。相反,您应该使用HTML或XML DOM方法来提取所需的信息。

如果您真的想要或需要使用正则表达式,可以尝试以下内容。

>[^<]*bla[^<]*<

但我确信这在一般情况下不起作用。

答案 7 :(得分:0)

* * 使用前瞻

找到了一个新的解决方案
 var pageHTML ="  <span aa span > span asa span";
 var regex = "span(?!([^<]+)?>)";

这个正则表达式只会在没有“&lt;”的情况下才会找到“span”这个词然后它有“&gt;”在它之后。

**旧解决方案

这是我的解决方案,我正在寻找“asd”,如果周围有开放和关闭的标签,我会忽略这个匹配。

我这样做,通过查看匹配单词的右侧和左侧,如果我发现它被标签包围,我会返回相同的匹配单词“我不会替换它”,如果不是,我将其替换为我需要的文字

    var pageHTML ="  < aa asd > asd < asd";
    var regex = "asd";
    var pattern = new RegExp(regex, "gi");
    var replaceWord = "dsa";

    //Replace all instances of word/words with our special spans
    pageHTML = pageHTML.replace(pattern, function(match, index, original){
        var leftIndex = index;  
        var rightIndex = parseInt(parseInt(index)+match.length);

        var insideTag = false;
        var foundOpenTag = false;

        for(; leftIndex > 0; leftIndex--){
           if(pageHTML.charAt(leftIndex) == ">")
               break;
           if(pageHTML.charAt(leftIndex) == "<"){
                   foundOpenTag = true;
                   break;
               }
        }

        if(!foundOpenTag){
            return replaceWord;
        }

      for(; rightIndex < pageHTML.length ; rightIndex++){
           if(pageHTML.charAt(rightIndex) == "<")
               break;
           if(pageHTML.charAt(rightIndex) == ">" ){
                   insideTag = true;
                   break;
               }
        }
        if(insideTag)
            return match;
        else return replaceWord;


            });

警报(pageHTML);