2009-07-30 3 views
0

EDIT: OOPS, извините, я не был чист. У меня есть строка, которую я получаю из AJAX, которая является документом xhtml, мне нужно получить тег body, если я не могу создать дерево дерева из строки?Регулярное совпадение с содержимым тела HTML

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

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

Благодарим заранее.

+5

Почему бы вам не сделать это с помощью DOM? –

+0

Почему бы не опубликовать это как ответ, Джордж? –

+0

Я сделал, а затем удалил комментарий. Я тоже колебался, так как (он) он сказал (а), что хочет регулярное выражение. – geowa4

ответ

9

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

POST ВОПРОС EDIT:

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

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

+1 за то, что вы предлагаете правильный путь ... Я объяснил причины, по которым это был правильный путь, чтобы принять в ответ. – BenAlabaster

+0

«нужно»? Он не может быть (безопасным) с регулярным выражением. – Svante

+0

** @ Svante **: давайте не будем входить в здравомыслие. если бы мы начали говорить об этом, мы бы поняли, насколько сумасшедшим вы должны быть, чтобы даже смотреть на проклятый компьютер. – geowa4

5

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

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

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

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

+0

-1 Вам не нужен внешний вид - подтвердите утверждение. Регулярное выражение JavaScript имеет модификатор 'i'. И модификатор '.' Plus '' можно заменить на '[\ s \ S]', '[\ w \ W]', '[\ d \ D]' и т. Д. – Gumbo

+0

@ Gumbo вы можете указать мне к документации, чтобы поддержать это? У меня были проблемы с этим в прошлом, и я не вызывал радости, потому что вся документация предполагает иное. Можете ли вы опубликовать регулярное выражение, которое * будет * работать, чтобы я мог проверить его и проверить? Тогда я могу удалить этот ответ как неточный. – BenAlabaster

+0

См. Https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp – Gumbo

0

Существует альтернативное исправление для точек соответствия новой строке ограничение библиотеки RegExp в JavaScript. XRegExp - это мощная библиотека с открытым исходным кодом с почти безграничной лицензией «Лицензия MIT» (для коммерческих проектов), которая очень компактна (2.7KB gzipped) и мощная.

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

+0

+1 Фантастическая находка! Вы знаете, какой вкус регулярного выражения он реализует? Кажется очень перспективным на первый взгляд. – BenAlabaster

+0

Ознакомьтесь с разделом http://xregexp.com/syntax/. Это дает вам представление о том, какую версию он использует на основе поддержки Named Capture, которая, как представляется, является .NET. – Rudisimo

1

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

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

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

Удачи, пытаясь его прочитать.

+0

Хорошо, вы меня избили - хорошая работа, +1 для прочности на сдвиг. Однако это выражение смешно. Я бы не рекомендовал это моему злейшему врагу по пересечению DOM. – BenAlabaster

1

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

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

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

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

View the example source code here

(серьезно, этот код некрасиво. Это стоит использовать библиотеку и установки типа пантомимы правильно ...)

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); 
} 
Смежные вопросы