Регулиряки негативный просмотр и прочее
Есть такой код:
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 Ссылка] Чтобы не было конфликтов |
1. А почему он должен отображать его подчеркнутым?
2. Негативного просмотра в js нет |
Цитата:
* test * /\*(.+)\*/gm так тож не работает |
|
Точка по-прежнему - любой символ, кроме новой строки. В javascript нет флага, который устанавливает мультилайн-режим для точки. Для того, чтобы заматчить совсем что угодно - используйте [\s\S].
|
var replacements = { '<strong>$1</strong>': /\*\*([\s\S]+)\*\*/g, '<em>$1</em>': /\*([\s\S]+)\*/g, http://gyazo.com/8866339c3a23a9f7994709c4c14a13b3 |
#1:
Если вы используете /\*\*([\s\S]+)\*\*/g, то имейте ввиду, что этот квантификатор является жадным, и он пойдет до последней двойной звёздочки во входной строке. Чтобы выделить текст до ближайшей двойной звёздочки, нужно использовать или: /\*\*([\s\S]+?)\*\*/g (ленивый квантификатор), или: /\*\*([^*]+)\*\*/g если текст внутри не может содержать звёздочки. #2: Негативный просмотр пишется так: (?! ... ) Но я не совсем понял, как должна работать регулярка для ссылки с негативным просмотром. |
Кажется, вы хотели использовать негативный просмотр назад. Однако в Javascript нет просмотров назад, ни негативных, ни позитивных, только вперёд.
|
Антон Крамолов,
Свормулируйте свою задачу без кодов, тогда скорее всего будет коллективное соревнование, а так - многобукв |
Все просто:
[url name] -> <a href="url">name</a> а если же в тексте встречается прсто ссылка с http:// начинающиеся мы ее тож делаем активной |
а негативный просмотр нужен чтобы проверить нет ли перед ссылкой скобки открывающей '['
|
Антон Крамолов,
У меня на линейнике, тоже всё тривиально, но контексы пояснений могут просто не совпадать (линейник, - линейный ускоритель) Поэтому поясните так, чтобы было понятно чуть разбирающемуся в ява скрипт Что означает активна? Где надо выполнить поиск Какой вид исходной строки нужно перепарсить/трансформировать! |
|
|
Цитата:
|
Не знал
|
Вообщем тогда подскажите по разметке как лучше сделать ща так
*наклонный* **жирный** * элемент обычного списка # элемент нумерованного списка ## Заголовок ## [ссылка название] Что для изображений придумать? |
Антон Крамолов,
Опять же задача не объяcнена - почему не воспользоваться стандартными BB - тегами ? (Cм кнопки в форме ответа ?) |
Много букв при наборе подобие wiki лучше
|
Антон Крамолов,
Хм - думал есть меню с кнопками |
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 вставить |
У вас в регулярке есть захватывающие скобки. Поэтому split в массив кидает, помимо прочего, ещё и совпадения в скобках.
Если вам просто надо показать текст в элементе с сохранением переносов строк, то лучше установить свойство CSS white-space: pre-line. |
было время
|
Часовой пояс GMT +3, время: 14:28. |