正则表达式匹配HTML正文的内容

时间:2009-07-30 17:07:47

标签: javascript regex

编辑:OOPS,对不起,我不清楚。我有一个从AJAX获得的字符串,它是一个xhtml文档,我需要获取它的body标签,除非我可以从字符串生成一个dom树?

我需要从字符串中的body标签获取所有内容,包括标记,以及javascript正则表达式。

我知道这是重复的,但我在其他问题中找到的正则表达式是针对不同版本的正则表达式,并且给了我错误。

提前感谢。

5 个答案:

答案 0 :(得分:9)

document.getElementsByTagName('body')[0].innerHTML将返回body标签中的所有内容。这不是一个正则表达式,但我不确定你为什么需要一个......?

POST QUESTION EDIT:

您执行AJAX的XHR对象具有responseTextresponseXML属性。只要响应是有效的xml(可能应该是这样),就可以在我提到的xml对象上使用getElementsByTagName获得所需的任何标记。但如果你只想要身体的内在部分,我会这样做:

var inner = myXHR.responseText.split(/(<body>|</body>)/ig)[2]);

答案 1 :(得分:5)

正则表达式不是解析DOM的理想工具,正如您将在本网站和其他网站中看到的那样。 George IV建议的最理想的方法是使用更适合这个的JavaScript工具,即getElementsByTagName并获取innerHTML:

var bodyText = document.getElementsByTagName("body")[0].innerHTML;

Edit1 :我还没有检查过,但是Rudisimo提出了一个显示很多承诺的工具 - XRegExp库是一个麻省理工学院开放源代码和可扩展库。这可能是一个可行的选择 - 我仍然认为DOM是更好的方法,但这看起来远远优于正则表达式的标准JavaScript实现。

Edit2 :由于Gumbo提供的示例,我放弃了之前关于Regex引擎的陈述[出于准确性的原因] - 但表达式可能是荒谬的。但是,我坚持认为在这种情况下使用正则表达式本身就是一种不好的方法,你应该使用前面提到的例子来引用DOM。

答案 2 :(得分:1)

通常,正则表达式不适合解析。但是如果你真的想使用正则表达式,试试这个:

/^\s*(?:<(?:!(?:(?:--(?:[^-]+|-[^-])*--)+|\[CDATA\[(?:[^\]]+|](?:[^\]]|][^>]))*\]\]|[^<>]+)|(?!body[\s>])[a-z]+(?:\s*(?:[^<>"']+|"[^"]*"|'[^']*'))*|\/[a-z]+)\s*>|[^<]+)*\s*<body(?:\s*(?:[^<>"']+|"[^"]*"|'[^']*'))*\s*>([\s\S]+)<\/body\s*>/i

如您所见,没有简单的方法可以做到这一点。我甚至不会声称这是一个正确的正则表达式。但它应该考虑评论标记(<!-- … -->),CDATA标记(<![CDATA[ … ]]>)和普通HTML标记。

尝试阅读时祝你好运。

答案 3 :(得分:1)

每个人似乎都死于使用正则表达式,所以我想我会走另一条路并回答你的第二个查询。

理论上可以将AJAX的结果解析为xmlDocument。 如果您希望这样做,您可能需要采取一些步骤。

  1. 使用库。我推荐jQuery
  2. 如果您使用的是库,必须确保响应的mimetype是xml mimetype!
  3. 确保在所有目标浏览器中进行彻底测试。你会被绊倒。
  4. 话虽这么说,我在jsbin上创建了一个快速示例。 它很适用于IE和Firefox,不幸的是为了让它工作,我不得不滚动我自己的XMLHttpRequest对象。

    View the example source code here

    (说真的,这个代码很难看。值得使用库并正确设置mime类型......)

    function getXHR() {
        var xmlhttp;
        //Build the request
        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            // code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            alert("Your browser does not support XMLHTTP!");
        }
    
    
        //Override the mime type for firefox so that it returns the 
        //result as an XMLDocument.
        if( xmlhttp.overrideMimeType ) {
            xmlhttp.overrideMimeType('application/xhtml+xml; charset=x-user-defined');
        }
    
        return xmlhttp;
    }
    
    function runVanillaAjax(url,functor)
    {
        var xmlhttp = getXHR();
        xmlhttp.onreadystatechange=function() { functor(xmlhttp); };
        xmlhttp.open("GET",url,true);
        xmlhttp.send(null);
    }
    
    function vanillaAjaxDone( response ) {
        if(response.readyState==4) {
    
            //Get the xml document element for IE or firefox
            var xml;
            if ($.browser.msie) {
                xml = new ActiveXObject("Microsoft.XMLDOM");
                xml.async = false;
                xml.loadXML(response.responseText);
            } else {
                xml = response.responseXML.documentElement;
            }
    
            var textarea = document.getElementById('textarea');
            var bodyTag = xml.getElementsByTagName('body')[0];
            if( $.browser.msie ) {
                textarea.value = bodyTag.text;
            } else {
                textarea.value = bodyTag.textContent;
            }
        }
    }
    
    function vanillaAjax() {
        runVanillaAjax('http://jsbin.com/ulevu',vanillaAjaxDone);
    }
    

答案 4 :(得分:0)

对于JavaScript中的RegExp库, dot匹配newline 限制还有另一种方法。 XRegExp是一个功能强大的开源库,具有几乎无限的许可证“ MIT License ”(用于商业项目),它非常紧凑(2.7KB gzip)并且功能强大。

如果你转到 New Flags 部分,你可以看到有一个标志( s ),其中 dot 匹配所有字符;包括换行符。