【问题标题】:Matching text in HTML without contents of the tag匹配 HTML 中没有标签内容的文本
【发布时间】:2009-04-07 13:12:09
【问题描述】:

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

例子:

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

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

编辑:

HTML是通过innerHTML得到的,匹配的会被<span class="x">$text</span>包围,然后重写为本节点的innerHTML,所有这些都没有杀死其他标签。

EDIT2 和我的解决方案:

我编写了自己的搜索,它是逐字符搜索,带有缓存和标志。

感谢您的帮助!

【问题讨论】:

    标签: javascript html regex


    【解决方案1】:

    您可以使用 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)

    【讨论】:

      【解决方案2】:

      如果您在 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"
      

      【讨论】:

        【解决方案3】:
        (?<!\<|/)span
        

        这应该给出所有不是标签的跨度事件。希望这至少有一点帮助:)

        说明:找出每个span 出现不是前面有&lt;/

        【讨论】:

        • sry 但 js 中没有后视:regular-expressions.info/javascript.html,例如“href”是什么?
        • 然后尝试改变方法。不要强迫 javascript 解决它不是设计用来解决的问题。无论你在做什么,试着从不同的角度看待手头的任务。
        【解决方案4】:

        你想做的事可以用 jQuery 轻松完成:

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

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

        jQuery Regular Expressions

        如需更优雅的解决方案,请创建custom selector

        【讨论】:

          【解决方案5】:
          /span(?=[^>]*<)/
          

          换句话说,从单词“span”的末尾向前看,在下一个左尖括号之前没有右尖括号,所以我们不能在标签内。据说,带引号的属性值可以包含右尖括号,尽管我从未见过这样做。但是,为了涵盖这种可能性,您可以使用这个正则表达式:

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

          【讨论】:

            【解决方案6】:

            如果我理解正确,您想搜索一个词,但只搜索不属于 HTML 标记的词。

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

            【讨论】:

              【解决方案7】:

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

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

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

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

              但我很确定这在一般情况下是行不通的。

              【讨论】:

                【解决方案8】:

                ** 发现使用前瞻的新解决方案

                 var pageHTML ="  <span aa span > span asa span";
                 var regex = "span(?!([^<]+)?>)";
                

                这个正则表达式只有在它没有“”时才会找到“span”这个词。

                ** 旧解决方案

                这是我的解决方案,我正在寻找“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);

                【讨论】:

                  猜你喜欢
                  • 2018-07-08
                  • 2010-10-09
                  • 2014-09-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-29
                  • 2011-01-12
                  相关资源
                  最近更新 更多