Регулярное выражение для соответствия содержимому тела HTML - PullRequest
0 голосов
/ 30 июля 2009

РЕДАКТИРОВАТЬ: Упс, извините, я не ясно. У меня есть строка, которую я получаю из AJAX, которая является документом xhtml, мне нужно получить ее тег body, если только я не могу сгенерировать дерево dom из строки?

Мне нужно получить все из тега body в строке, включая разметку, с регулярным выражением javascript.

Я знаю, что это дубликат, но регулярные выражения, которые я нашел в других вопросах, были для разных разновидностей регулярных выражений и дали мне ошибки.

Спасибо заранее.

Ответы [ 5 ]

9 голосов
/ 30 июля 2009

document.getElementsByTagName('body')[0].innerHTML вернет строку всего в теге body. Это не регулярное выражение, но я не уверен, зачем он тебе нужен ...?

РЕДАКТИРОВАНИЕ ПОЧТОВОГО ВОПРОСА:

Ваш объект XHR, с которым вы выполняли свой AJAX, имеет свойства responseText и responseXML. Пока ответ является действительным xml, что, вероятно, должно быть, вы можете получить любой тег, который хотите, используя getElementsByTagName для объекта xml, о котором я говорил. Но если вы просто хотите внутренние части тела, я бы сделал это так:

var inner = myXHR.responseText.split(/(<body>|</body>)/ig)[2]);
5 голосов
/ 30 июля 2009

Regex - не идеальный инструмент для анализа DOM, как вы уже упоминали на этом и других сайтах. Наиболее идеальным способом, как предложил Джордж IV, является использование более подходящих для этого инструментов JavaScript, таких как getElementsByTagName, и получение innerHTML:

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

Edit1 : Я еще не проверил это, но Рудисимо предложил инструмент, который показывает лот обещания - XRegExp Библиотека, которая является открытые источники и расширяемая библиотека из MIT. Это потенциально может быть приемлемым вариантом - я все еще думаю, что DOM - лучший способ, но это выглядит намного лучше, чем стандартная реализация JavaScript в regex.

Edit2 : Я отрекаюсь от своих предыдущих утверждений о движке Regex [из соображений точности] из-за примера, предоставленного Gumbo - каким бы абсурдным оно ни было. Тем не менее, я придерживаюсь своего мнения, что использование регулярных выражений в данном случае является по своей сути плохим путем, и вам следует ссылаться на DOM, используя вышеупомянутый пример.

1 голос
/ 31 июля 2009

Кажется, что все устали от использования регулярных выражений, поэтому я решил пойти другим путем и ответить на второй ваш запрос.

Теоретически возможно проанализировать результат вашего AJAX как xmlDocument. Есть несколько шагов, которые вы, вероятно, захотите предпринять, если хотите, чтобы это работало.

  1. Используйте библиотеку. Я рекомендую JQuery
  2. Если вы используете библиотеку, вы должны убедиться, что mimetype ответа - это mimetype xml!
  3. Убедитесь, что вы тщательно тестировали во всех ваших целевых браузерах. Вы будете сбиты с толку.

Как говорится, я создал быстрый пример на jsbin. Он работает как в IE, так и в Firefox, к сожалению, чтобы заставить его работать, мне пришлось свернуть свой собственный объект XMLHttpRequest.

Просмотреть пример исходного кода здесь

(Если серьезно, этот код уродлив. Стоит использовать библиотеку и правильно настроить тип 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);
}
1 голос
/ 30 июля 2009

В общем случае регулярные выражения не подходят для разбора. Но если вы действительно хотите использовать регулярное выражение, попробуйте это:

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

Как видите, простого способа сделать это не существует. И я бы даже не утверждал, что это правильное регулярное выражение. Но он должен учитывать теги комментариев (<!-- … -->), теги CDATA (<![CDATA[ … ]]>) и обычные теги HTML.

Удачи при чтении.

0 голосов
/ 30 июля 2009

Существует альтернативное исправление ограничения соответствия новой строки библиотеки RegExp в JavaScript. XRegExp - это мощная библиотека с открытым исходным кодом с практически неограниченной лицензией " MIT License " (для коммерческих проектов), очень компактная (2,7 КБ в сжатом виде) и мощная.

Если вы перейдете в раздел Новые флаги , вы увидите, как существует флаг ( s ), в котором точка соответствует все символов; включая переводы строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...