Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулиряки негативный просмотр и прочее (https://javascript.ru/forum/misc/28869-reguliryaki-negativnyjj-prosmotr-i-prochee.html)

Антон Крамолов 05.06.2012 16:03

Регулиряки негативный просмотр и прочее
 
Есть такой код:

var replacements = {
    '<strong>$1</strong>': /\*\*(.+)\*\*/g,
    '<em>$1</em>': /\*(.+)\*/g,
    '<a href="$1">$2</a>': /\[([^\s"]+) (\w+)\]/g,
    '<a href="$1">$1</a>': /(https?:\/\/(?:www\.)?\w+(\.\w+)*(?::\d+)?(?:\/[^\s]*)?)/g
}

window.addEventListener('load', function() {
    var body = ge('body');
    
    body.onkeypress = body.onkeyup = function() {
        var v = val(this);
        v = stripTags(v);
        
        for (var x in replacements) {
            v = v.replace(replacements[x], x);
        }
        
        v = v.replace(/\r\n|\r|\n/g, '<br>');
        val('preview', v);
    }
}, false);


Вводишь в текстовое поле *test*

он в диве отображает

test


Вопрос #1:

Почему

*
test
*

Не отображается наклонным? Ведь используется модификатор 'g'

#2 Негативный просмотр

// Если попытаться использовать вместо этого

'<a href="$1">$1</a>': /(https?:\/\/(?:www\.)?\w+(\.\w+)*(?::\d+)?(?:\/[^\s]*)?)/g

// Регулярку с негативным просмотром, то все отказывается работать
/(?<!\[)(https?:\/\/(?:www\.)?\w+(\.\w+)*(?::\d+)?(?:\/[^\s]*)?)/g


Как бы для ссылок

[http://site.ru Ссылка]

Чтобы не было конфликтов

nerv_ 05.06.2012 16:21

1. А почему он должен отображать его подчеркнутым?
2. Негативного просмотра в js нет

Антон Крамолов 05.06.2012 16:34

Цитата:

Сообщение от nerv_ (Сообщение 179154)
1. А почему он должен отображать его подчеркнутым?
2. Негативного просмотра в js нет

Я исправил,

*
test
*


/\*(.+)\*/gm

так тож не работает

Антон Крамолов 05.06.2012 16:41

http://gyazo.com/7949c51b778e5734fdd...png?1338899515

Антон Крамолов 05.06.2012 16:58

Точка по-прежнему - любой символ, кроме новой строки. В javascript нет флага, который устанавливает мультилайн-режим для точки. Для того, чтобы заматчить совсем что угодно - используйте [\s\S].

Антон Крамолов 05.06.2012 17:00

var replacements = {
    '<strong>$1</strong>': /\*\*([\s\S]+)\*\*/g,
    '<em>$1</em>': /\*([\s\S]+)\*/g,


http://gyazo.com/8866339c3a23a9f7994709c4c14a13b3

oneguy 05.06.2012 17:54

#1:
Если вы используете /\*\*([\s\S]+)\*\*/g, то имейте ввиду, что этот квантификатор является жадным, и он пойдет до последней двойной звёздочки во входной строке. Чтобы выделить текст до ближайшей двойной звёздочки, нужно использовать или:
/\*\*([\s\S]+?)\*\*/g (ленивый квантификатор), или:
/\*\*([^*]+)\*\*/g если текст внутри не может содержать звёздочки.
#2:
Негативный просмотр пишется так: (?! ... ) Но я не совсем понял, как должна работать регулярка для ссылки с негативным просмотром.

oneguy 05.06.2012 18:13

Кажется, вы хотели использовать негативный просмотр назад. Однако в Javascript нет просмотров назад, ни негативных, ни позитивных, только вперёд.

Deff 05.06.2012 18:17

Антон Крамолов,
Свормулируйте свою задачу без кодов, тогда скорее всего будет коллективное соревнование, а так - многобукв

Антон Крамолов 05.06.2012 19:09

Все просто:

[url name] -> <a href="url">name</a>
а если же в тексте встречается прсто ссылка с http:// начинающиеся мы ее тож делаем активной


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