регулярное выражение в js

1. Изнаур (06.09.2013 / 18:32)
Здравствуйте,есть html код,надо регулярным выражением вырезать всё что находится между <div class="gmenu"></div>,пытался так data.match('~<div class="gmenu">(.*?)</div>~s');,но возвращает 0

2. Дмитрий (06.09.2013 / 18:38)
Этот блок на странице один или несколько?
Регулярку можно применить, но ресурсов потребуется больше, чем применить функцию.

3. Дмитрий (06.09.2013 / 18:50)
Вобщем, дешевле сделать так:
<script>
function clearContent(box, replase) {
	var arr = document.body.getElementsByClassName(box);
	if (!arr) return false;
	
	var len  = arr.length;
	if (len <= 0) return false;
	
	if (!replase) var replase = '';
	
	for(var i=0; i<len; i++) arr[i].innerHTML = replase;
};
</script>


<div class="ololo">Lorem ipsum dolor sit amet...</div>
<div class="ololo">Lorem ipsum dolor sit amet...</div>
<div class="ololo">Lorem ipsum dolor sit amet...</div>
<div class="ololo">Lorem ipsum dolor sit amet...</div>

<script>clearContent('ololo');</script>
Функция clearContent() примет 2 аргумента. Первый обязательный - название класса блока. Второй - необязательный, принимает значение, на которое надо заменить контент в блоке с искомым классом.

Например так:
<script>clearContent('ololo', 'новый контент');</script>


4. Изнаур (06.09.2013 / 18:53)
ох извиняюсь,почему то я написал что надо вырезать,нет мне надо получить то что в div'aх

Добавлено через 01:13 сек.
document.body.getElementsByClassName(box);
за это спасибо,думаю тогда нужда в регулярках отпадает

5. Дмитрий (06.09.2013 / 19:03)
4. Iznaur95, тогда сделай так:

<script>
function valuesContent(box, replase) {
	var arr = document.body.getElementsByClassName(box);
	if (!arr) return false;
	
	var len  = arr.length;
	if (len <= 0) return false;
	
	if (!replase) var replase = '';
	var values = [];
	
	for(var i=0; i<len; i++) {
		values.push(arr[i].innerHTML);
		arr[i].innerHTML = replase;
	}
	return values;
};
</script>

<div class="ololo">Содержимое блока 1</div>
<div class="ololo">Содержимое блока 2</div>
<div class="ololo">Содержимое блока 3</div>
<div class="ololo">Содержимое блока 4</div>

<script>
var values = valuesContent('ololo', 'новый контент');
if (values) alert(values[0]);
</script>

Функция valuesContent() работает так же, как я написал выше, но вернет либо FALSE, либо массив с содержимым всех блоков с искомым классом.

Принять можно либо просто values[0] - это первый найденный элемент, либо перебором массива. Как удобнее.

6. Изнаур (06.09.2013 / 19:11)
5. dima.london, спасибо

7. Дмитрий (06.09.2013 / 19:22)
6. Iznaur95, а самый простой способ такой:
<script>
var value = document.body.getElementsByClassName('искомый_класс')[0];
</script>
Но учти, что getElementsByClassName() не поддерживается древними браузерами типа Netscape, IE6 и прочими.

8. Изнаур (06.09.2013 / 19:23)
7. dima.london, это мне и не нужно)пытаюсь написать расширение под хром...

9. Изнаур (07.09.2013 / 15:32)
не могу вывести полученные данные, вот функция:
function handleServerResponse()
{
// прочитать сообщение, полученное от сервера(ajax запрос)
   var xmlResponse = xmlHttp.responseXML;
   xmlRoot = xmlResponse.documentElement;
  var sm = xmlRoot.getElementsByClassName('gmenu');
  console.log(sm);
    myDiv = document.getElementById("lol");
// вывести полученный код HTML
    myDiv.innerHTML = sm.item(0).data;
}
в логах html код показывает,а вот вывести на страницу не удается,никак,sm.item(0).data возвращает undefined,sm.item(0) возвращает [object HTMLDivElement]

Добавлено через 03:08 сек.
хотел использовать responseText т.к. в ответ получаю html код,но тогда getElementsByClassName не работает

10. Дмитрий (07.09.2013 / 18:37)
В каком формате AJAX возвращает информацию? Надо принимать responseText, и если приходит в JSON или XML или еще как-то экзотически, надо преобразовывать эти данные в нормальный вид.

11. Изнаур (07.09.2013 / 20:14)
проверил responseText:
   var xmlResponse = xmlHttp.responseText;
   console.log(xmlResponse);
html
но как вот с этим полученным html работать?например console.log(xmlResponse.getElementsByTagName('small')); ничего не возвращает

12. Дмитрий (07.09.2013 / 20:21)
console.log(xmlResponse.getElementsByTagName('small')[0]);

13. Изнаур (07.09.2013 / 20:58)
не возвращает ничего...

14. Изнаур (07.09.2013 / 21:10)
я так понял js не воспринимает ответ как DOM,пришлось пользоваться регулярками

15. Дмитрий (07.09.2013 / 21:15)
14. Iznaur95, конечно не воспринимает, если скрипт отдает результат любым другим способом, кроме обычного HTML. Как скрипт отдает информацию, покажи? Именно строки, где отдается информация и останавливается выполнение.

16. Изнаур (07.09.2013 / 21:30)
var xmlHttp = createXmlHttpRequestObject();
// создает экземпляр объекта XMLHttpRequest
function createXmlHttpRequestObject()
{
// переменная для хранения ссылки на объект XMLHttpRequest
    var xmlHttp;
// эта часть кода должна работать во всех броузерах, за исключением
// IE6 и более старых его версий
    try
    {
// попытаться создать объект XMLHttpRequest
	xmlHttp = new XMLHttpRequest();
    }
    catch (e){}
// вернуть созданный объект или вывести сообщение об ошибке
    if (!xmlHttp)
	alert("Ошибка создания объекта XMLHttpRequest.");
    else
	return xmlHttp;
}
// вызывается для чтения файла с сервера
function process()
{
// продолжать только если в xmlHttp не пустая ссылка
    if (xmlHttp)
    {
// попытаться установить соединение с сервером
	try
	{
	    var d = "http://nero.16mb.com/mail/index.php?act=input";
	    // инициировать чтение файла с сервера
	    xmlHttp.open("GET", d, true);
	    xmlHttp.onreadystatechange = handleRequestStateChange;
	    xmlHttp.send(null);
	}
// вывести сообщение об ошибке в случае неудачи
	catch (e)
	{
	    setTimeout('process()', 5000);
	}
    }
}
// эта функция вызывается при изменении состояния запроса HTTP
function handleRequestStateChange()
{
// когда readyState = 4, мы можем прочитать ответ сервера
    if (xmlHttp.readyState == 4)
    {
// продолжать, только если статус HTTP равен «OK»
	if (xmlHttp.status == 200)
	{
	    try
	    {
// обработать ответ, полученный от сервера
		handleServerResponse();
	    }
	    catch (e)
	    {
// вывести сообщение об ошибке
		setTimeout('process()', 5000);
	    }
	}
	else
	{
	    setTimeout('process()', 5000);
	}
    }
}
// обрабатывает ответ, полученный от сервера
function handleServerResponse()
{
// прочитать сообщение, полученное от сервера
   var xmlResponse = xmlHttp.responseText; 
   //console.log(xmlResponse);
  //var ex = xmlResponse.body;
 myDiv = document.getElementById("lol");
// вывести полученный код HTML
 var ns = xmlResponse.match('<div class="gmenu">(.*?)</div>');
    myDiv.innerHTML = ns[0];
    /* //console.log(xmlResponse);
  // xmlRoot = xmlResponse.documentElement;
  // console.log(xmlRoot);
  // console.log(xmlRoot);
  var sm = xmlRoot.getElementsByClassName('gmenu');
  console.log(sm);
    myDiv = document.getElementById("lol");
// вывести полученный код HTML
    myDiv.innerHTML = sm.item(0).data;
*/
}
вот весь код

17. Изнаур (07.09.2013 / 21:30)
может дело в этом?
header('Content-type: application/xhtml+xml; charset=UTF-8');(на стороне сервера)

18. Дмитрий (07.09.2013 / 23:41)
16. Iznaur95, ёптель, я же попросил всего пару строк серверной части.

Добавлено через 00:36 сек.
17. Iznaur95, да, 90%, что дело в этом заголовке.

19. Изнаур (08.09.2013 / 00:31)
18,спасибо,если кому нужно проблему можно решить так:
//превращение в DOM
    var mydoc=document.createElement('div');
    mydoc.innerHTML=xmlHttp.responseText;
    console.log(mydoc.getElementsByTagName('small'));


URL: https://visavi.net/topics/38889