Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Есть ли метод поиска по тегам в []?


Автор: nule 3.11.2011, 11:51
Приветствую!
Задача выловить из страницы форума текст, находящийся под спойлером. Текст заключен в "форумный" тег  [spoler][/spoler]. 
getElementsByTagName работает только с html-тегами в <>, а как быть с тегами в []? Есть ли готовые решения?
Спасибо!

Автор: $дмитрий 3.11.2011, 12:16
Примерно так
Код

var text = 'text [spoler]inner text[/spoler] txt';
var result = text.match(/\[spoler\](.+?)\[/spoler\]/g);


Автор: Egik2 3.11.2011, 15:03
Ты точно уверен, что произвольный тег не ищется?
Метод getElementsByTagName работает с DOM моделью документа и с HTML имеет слабую связь

Автор: nule 3.11.2011, 15:10
Цитата(Egik2 @ 3.11.2011,  15:03)
Ты точно уверен, что произвольный тег не ищется?
Метод getElementsByTagName работает с DOM моделью документа и с HTML имеет слабую связь

Не ищется. Это же даже не тег, а BB-код.
Насчет варианта $дмитрий, разбираюсь. Пока ничего не понятно.

Автор: Egik2 3.11.2011, 15:44
Ааа, понятно. Тогда не будет работать. 
В дополнение к совету $дмитрия советую почитать http://javascript.ru/basic/regular-expression

Автор: nule 3.11.2011, 16:57
Цитата(Egik2 @ 3.11.2011,  15:44)
Ааа, понятно. Тогда не будет работать. 
В дополнение к совету $дмитрия советую почитать http://javascript.ru/basic/regular-expression

Спасибо. В целом разобрался, но запутался в слэшах.  
Код

var text = 'text [sp]inner text[sp] txt';
var x = text.match(/[sp](.+?)[sp]/g);

Такой код даёт результат 
Код

sp]inner text[s

Как убрать артефакты по краям, никак не соображу. В примере $дмитрий видимо со слэшами тоже не всё в порядке, т.к. именно в таком виде пустой.

Автор: Evghenusi 3.11.2011, 17:56
Цитата(nule @  3.11.2011,  16:57 Найти цитируемый пост)
В примере $дмитрий видимо со слэшами тоже не всё в порядке
угу, не за экранирован слэш.
Код
var result = text.match(/\[spoler\](.+?)\[\/spoler\]/g);


Цитата(nule @  3.11.2011,  16:57 Найти цитируемый пост)
Как убрать артефакты по краям, никак не соображу.

Код
var result = text.match(/(?<=\[spoler\])(.+?)(?=\[\/spoler\])/g);
 ?

Автор: nule 3.11.2011, 18:24
Цитата(Evghenusi @ 3.11.2011,  17:56)
?

Увы. Результат - пустая строка smile 

Автор: Evghenusi 3.11.2011, 18:44
Цитата(nule @  3.11.2011,  18:24 Найти цитируемый пост)
Результат - пустая строка

результат ошибка. почему-то JS против назад смотрящего утверждения (?<=), хз как исправить.

предлагаю перейти на Perl или PHP там таких ошибок нет  smile (не воспринимайте всерьёз)

Автор: nule 4.11.2011, 08:39
Код

11.1.7. Средства регулярных выражений Perl, не поддерживаемые в JavaScript
Мы говорили, что ECMAScript v3 определяет относительно полное подмножество средств регулярных выражений из Perl 5. Развитые средства Perl, не поддерживаемые ECMAScript, включают следующее:
• флаги s (однострочный режим) и x (расширенный синтаксис);
• управляющие последовательности \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z и \G;
• (?<= – положительное условие на предыдущие символы и отрицатель
ное условие на предыдущие символы;
• комментарий (?# и прочий расширенный синтаксис (?.

Дэвид Флэнаган, JS подробное руководство, 5 издание.

 smile 

Автор: Egik2 4.11.2011, 09:56
Немного модифицированный вариант

Код

var text = 'text [spoler]inner text[/spoler] txt';

var regexp = /\[spoler\](.+?)\[\/spoler\]/g;

var res = regexp.exec(text)


Результат в переменной res будет массив

["[spoler]inner text[/spoler]", "inner text"]

Таким образом res[1] будет содержать искомое содержимое тега.
Метод exec возвращает массив совпадающих значений и Вы сможете таким образом обработать все теги на странице

Автор: $дмитрий 4.11.2011, 09:59
Все находит
Код

var text = 'text [sp]inner text1[/sp] txt [sp]inner text2[/sp]';
var x = text.match(/\[sp\](.+?)\[\/sp\]/g);

alert(x[0]);
alert(x[1]);

Автор: nule 4.11.2011, 10:52
Цитата

Обратите внимание: exec() всегда включает полную информацию для найденного со 
ответствия в возвращаемый им массив независимо от того, является  regexp глобаль 
ным   шаблоном   или   нет.   Этим  exec()  отличается   от   метода  String.match(),   который 
возвращает намного меньше информации при работе с глобальными шаблонами. Вы 
зов exec() в цикле – единственный способ получить полную информацию о результа 
тах поиска для глобального шаблона. 

Дэвид Флэнаган, JS подробное руководство, 5 издание.

Для примера выше разницы между match и exec никакой, как я понял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)