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:// начинающиеся мы ее тож делаем активной

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

а негативный просмотр нужен чтобы проверить нет ли перед ссылкой скобки открывающей '['

Deff 05.06.2012 19:20

Антон Крамолов,
У меня на линейнике, тоже всё тривиально, но контексы пояснений могут просто не совпадать (линейник, - линейный ускоритель)
Поэтому поясните так, чтобы было понятно чуть разбирающемуся в ява скрипт
Что означает активна?
Где надо выполнить поиск
Какой вид исходной строки нужно перепарсить/трансформировать!

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

http://ссылка -> делаем активной

[http://ссылка название] -> <a href="...">название</a>

devote 05.06.2012 19:57

поиск ссылок на странице

oneguy 05.06.2012 21:11

Цитата:

Сообщение от Антон Крамолов (Сообщение 179210)
http://ссылка -> делаем активной

[http://ссылка название] -> <a href="...">название</a>

Во второй параметр replace можно подставить функцию, которая принимает такие аргументы: (substring, capture1, capture2, ..., captureN, offset, string) и возвращает строку, которую нужно вставить. Это меняет многие вещи.

Антон Крамолов 05.06.2012 21:20

Не знал

Антон Крамолов 05.06.2012 21:26

Вообщем тогда подскажите по разметке как лучше сделать ща так

*наклонный*
**жирный**

* элемент обычного списка
# элемент нумерованного списка

## Заголовок ##

[ссылка название]

Что для изображений придумать?

Deff 05.06.2012 21:29

Антон Крамолов,
Опять же задача не объяcнена - почему не воспользоваться стандартными BB - тегами ? (Cм кнопки в форме ответа ?)

Антон Крамолов 05.06.2012 21:49

Много букв при наборе подобие wiki лучше

Deff 05.06.2012 21:50

Антон Крамолов,
Хм - думал есть меню с кнопками

Антон Крамолов 05.06.2012 22:11

v = v.trim();
        v = '<p>' + v;
        v = v.split(/(\r\n|\r|\n){2,}/).join('</p><p>');
        v += '</p>';
        val('preview', v);


Почему такой код неправильно работает?

Вводишь

1
2
3

Получается такое безобразие

<div id="preview" class="preview">
  <p>1</p>
  <p>
</p>
  <p>2</p>
  <p>
</p>
  <p>3</p>
</div>


Я хочу чтобы два переноса новый абзац, один тупо br вставить

oneguy 05.06.2012 22:52

У вас в регулярке есть захватывающие скобки. Поэтому split в массив кидает, помимо прочего, ещё и совпадения в скобках.
Если вам просто надо показать текст в элементе с сохранением переносов строк, то лучше установить свойство CSS white-space: pre-line.

Антон Крамолов 19.12.2012 14:43

было время


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