Преобразование регулярного выражения с отрицательным взглядом из формата PHP в формат Javascript - PullRequest
0 голосов
/ 16 февраля 2012

Мне нужно убрать встроенные разрывы строк, но не разрывы абзацев, когда браузер не IE.

Причиной такой необходимости является удобное форматирование предупреждающих сообщений.Оказывается, что основные не-IE браузеры сами форматируют сообщения, вставляя переносы строк в удобном месте.Однако IE не будет этого делать.Таким образом, неформатированная строка просто увеличивает ширину окна предупреждения.Мое решение состоит в том, чтобы отформатировать все предупреждающие сообщения с помощью разрывов строк для IE и удалить разрывы строк, когда браузер не является IE.Это дает красиво отформатированное предупреждение независимо от браузера.Если эта дополнительная обработка не выполняется, то у вас либо уродливые широкие окна предупреждений в IE (без разрывов), либо разорванный форматированный текст в браузерах, отличных от IE, поскольку присутствуют жестко запрограммированные разрывы строк и добавленные браузером разрывы строк.

Еще одним осложнением является то, что я не хочу зачеркивать ВСЕ разрывы строк, поскольку это также удалит разрывы абзацев.Таким образом, последнее требование состоит в том, чтобы убрать все одиночные разрывы строк, но не разрывы «параграфа», которые представляют собой просто два последовательных разрывов строки.быть сбежавшимПоэтому вместо того, чтобы рассматривать разрывы строк как \ n, они \\ n, и регулярное выражение должно искать шаблон \\ n.

Также обратите внимание: большинство наших важных "всплывающих сообщений и диалогов"сделано с использованием jquery, чтобы обеспечить красиво отформатированный дисплейТаким образом, другой подход заключается в том, чтобы полностью покончить с оповещениями и заменить их диалогами jquery.Однако в этих случаях мы не хотим заходить так далеко, а просто хотим красиво отформатированное окно оповещения.

Обычно мы выполняем обработку регулярных выражений в PHP, которая прекрасно работает.Проблема в том, что я также хотел бы иметь эквивалентную обработку в чистом JavaScript, если это возможно.Я подозреваю, что обработка javascript может не поддерживаться в негативном формате, по крайней мере так же, как в PHP.Если так, то это поднимает сложность.До сих пор я не смог придумать версию javascript.

Вот код PHP, который достигает желаемого результата:

/**
 * Removes embedded line breaks but not paragraph breaks if not IE
 *
 * @param string $message - formatted for IE, with embedded paragraph and line breaks
 * $is_IE - set elsewhere to indicate if the browser is IE
 */
function FormatAlert($message)
{
    global $is_IE;
    return ($is_IE) ?  $message : preg_replace('/(?<!\\\n)\\\n(?!\\\n)/', ' ', $message);
}

Таким образом, необходимо создать эквивалентное регулярное выражение дляjavascript.

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

1 Ответ

1 голос
/ 16 февраля 2012

Javascript поддерживает отрицательный взгляд вперед, но не взгляд назад.

Первоначально я ответил, что вам может не понадобиться lookbehind с: str.replace(/\n(?!\n)/g, '');, который удалит все новые строки, за которыми не следует другой.Это может хорошо работать в вашем случае всплывающего окна с предупреждением, но фактически удалит последнюю новую строку в последовательности двойной новой строки (так как за ней не следует новая строка), превращая разрыв строки в двойной строке впростой перевод строки.Чтобы исправить это, вам нужно будет использовать другую замену, чтобы вернуть другие символы новой строки, заменив оставшиеся лишними: http://jsfiddle.net/rgthree/99jCd/

var str = "This is an oddly\nbroken paragraph that\nwill turn"+
          "into one line.\n\nThis will still be a new\nand separate"+
          "paragraph that\nis also not broken.";    
str = str.replace(/\n(?!\n)/g, ' ').replace(/\n+\s/g, '\n\n');​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...