регулярное выражение в 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
style="font-size:x-small">
<option selected="selected">Быстрый переход</option>
<option value="guest">Гостевая</option>
<option value="forum">Форум</option>
<option value="news">Новости</option>
<option value="gallery">Галерея</option>
<option value="down">Загрузки</option>
<option value="lib">Библиотека</option>
<option value="gazen">Gazenwagen
</option>
</select><input type="submit" value="Go!" style="font-size:x-small"/></div></form></div><div class="footer"><a href="http://nero.16mb.com/users/index.php?act=online">Онлайн: 1 / 0</a></div><div style="text-align:center"><p><b>Powered by JohnCMS</b></p><script>
audiojs.events.ready(function() {
var as = audiojs.createAll();
});
</script>
<div><small>© <a href="http://johncms.com">JohnCMS</a></small></div></div></body></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