Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Внутренние вхождения, рекурсия (https://javascript.ru/forum/misc/37896-vnutrennie-vkhozhdeniya-rekursiya.html)

Toki 13.05.2013 06:16

Внутренние вхождения, рекурсия
 
Имеется такой скрипт
var str = 'sometext1 <b>sometext2 <b>sometext3</b> </b> sometext1';
str = str.replace(/\<b\>([\s\S]*)\<\/b\>/gim, function(match, contents, offset, s)
    {return "[b]"+contents+"[/b]";}
);
alert(str);

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

Aetae 13.05.2013 06:28

Почему останаливается на первом?
Потому что жадные скобки ([\s\S]*) забирают все символы вплоть до последнего вхождения <\/b>.
Как сделать не жадными?
([\s\S]*?)
Но так всё равно не работает!
И не будет.
Что же делать?
Идти иным путём, так str.replace(/<(\/?b)>/gi, '[$1]') или как нить иначе.

Toki 13.05.2013 07:19

Уже думал об этом, но почему-то все ассоциировал с php
имею в виду
$text = '<b>textasd</b>';
$text = preg_replace('<b>','[b]',$text);

При таком раскладе с видом страницей можно сильно похулиганить. Не будет ли каких либо эффектов с js'ом?

Aetae 13.05.2013 07:52

Имеете ввиду прохождение левых тегов? Таки их надо экранировать напрочь все.

danik.js 13.05.2013 08:22

Цитата:

Сообщение от Toki
При таком раскладе с видом страницей можно сильно похулиганить

Ну ты ведь как умный разработчик знаешь правило, которое гласит "Не доверяй данным, приходящим от клиента" и будешь фильтровать данные на сервере, верно?

Toki 13.05.2013 09:40

На счет прохождения не левых, а не парных тегов.
Цитата:

Сообщение от danik.js (Сообщение 250137)
Ну ты ведь как умный разработчик знаешь правило, которое гласит "Не доверяй данным, приходящим от клиента" и будешь фильтровать данные на сервере, верно?

Всё верно, по этому за php я спокоен.

В принципе, тему можно закрывать.
Всем спасибо :)


Часовой пояс GMT +3, время: 15:18.