Есть ли метод поиска по тегам в []?

 
0
 
JavaScript
ava
nule | 03.11.2011, 12:51
Приветствую!
Задача выловить из страницы форума текст, находящийся под спойлером. Текст заключен в "форумный" тег [spoler][/spoler].
getElementsByTagName работает только с html-тегами в <>, а как быть с тегами в []? Есть ли готовые решения?
Спасибо!
Kommentare (12)
ava
&#036;дмитрий | 03.11.2011, 12:16 #
Примерно так

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

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

Метод getElementsByTagName работает с DOM моделью документа и с HTML имеет слабую связь

Не ищется. Это же даже не тег, а BB-код.
Насчет варианта $дмитрий, разбираюсь. Пока ничего не понятно.
ava
Egik2 | 03.11.2011, 15:44 #
Ааа, понятно. Тогда не будет работать.
В дополнение к совету $дмитрия советую почитать Регулярные выражения в Java
ava
nule | 03.11.2011, 16:57 #
Цитата (Egik2 @ 3.11.2011, 15:44)
Ааа, понятно. Тогда не будет работать.

В дополнение к совету $дмитрия советую почитать Регулярные выражения в Java

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

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

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

sp]inner text[s

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


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

var result = text.match(/(?<=\[spoler\])(.+?)(?=\[\/spoler\])/g);
?
ava
nule | 03.11.2011, 18:24 #
Цитата (Evghenusi @ 3.11.2011, 17:56)
?

Увы. Результат - пустая строка smile
ava
Evghenusi | 03.11.2011, 18:44 #
Цитата (nule @ 3.11.2011, 18:24 findReferencedText)
Результат - пустая строка

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

предлагаю перейти на Perl или PHP там таких ошибок нет smile (не воспринимайте всерьёз)
ava
nule | 04.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
ava
Egik2 | 04.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 возвращает массив совпадающих значений и Вы сможете таким образом обработать все теги на странице
ava
&#036;дмитрий | 04.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]);
ava
nule | 04.11.2011, 10:52 #
Цитата


Обратите внимание: exec() всегда включает полную информацию для найденного со

ответствия в возвращаемый им массив независимо от того, является regexp глобаль

ным шаблоном или нет. Этим exec() отличается от метода String.match(), который

возвращает намного меньше информации при работе с глобальными шаблонами. Вы

зов exec() в цикле – единственный способ получить полную информацию о результа

тах поиска для глобального шаблона.


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

Для примера выше разницы между match и exec никакой, как я понял.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden