JavaScript RegExp объекты - PullRequest
       5

JavaScript RegExp объекты

3 голосов
/ 05 февраля 2009

Я пытаюсь написать простой анализатор Markdown на JavaScript. Поэтому я хочу проверить синтаксис [link content][link id]. Я использую следующий код:

data = data.replace( /\[(.*?)\][ ]*\[([0-9]+)\]/g, '<a href="$2">$1</a>' );

Это работает хорошо, но теперь я хочу сделать это с объектом RegExp. Поэтому я установил следующий бит кода:

var r = new RegExp( '\[(.*?)\][ ]*\[([0-9]+)\]', 'g' );
data = data.replace( r, '<a href="$2">$1</a>' );

Но это не работает. Он даже говорит, что мое регулярное выражение (которое работает, так как первый пример хорошо работает) недопустимо:

не найдено) в регулярном выражении

Я думаю, что это связано с некоторыми особенностями RegExp-объектов, о которых я не знаю. Что я делаю не так и как можно решить проблему?

Ответы [ 5 ]

13 голосов
/ 05 февраля 2009

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

var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' );
1 голос
/ 05 февраля 2009

В дополнение к проблеме обратной косой черты шаблона, это:

data = data.replace( r, '<a href="$2">$1</a>' );

может быть опасно. Я предполагаю, что вы уже позаботились о экранировании HTML, поэтому я не смогу сделать это:

[<script>stealCookies()</script>][http://oops.example.com/]
[hover me][http://hello" onmouseover="stealCookies()]

но вам все равно нужно будет проверить, что URL - это заведомо хорошая схема, поэтому я не могу сделать это:

[click me][javascript:stealCookies()]

Возможно, вы захотите использовать вариант метода String.replace (r, func) и включить валидацию в выполняющий замену 'func'.

0 голосов
/ 05 февраля 2009

Вам нужно дважды убежать:

var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' )
0 голосов
/ 05 февраля 2009

Двойной побег у тебя обратная косая черта:

var r = new RegExp( '\\[(.*?)\\][ ]*\[([0-9]+)\\]', 'g' );
0 голосов
/ 05 февраля 2009
var r = /\[(.*?)\][ ]*\[([0-9]+)\]/g;
data = data.replace( r, '<a href="$2">$1</a>' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...