String.replace с / и \ в Nodejs отличается от Chrome? - PullRequest
4 голосов
/ 24 сентября 2011

пытаюсь сделать роутер в нодейсе. Большую часть этого составляет URI -> action, поэтому мне понадобится легко настраиваемый список URI и регулярное выражение их в регулярные выражения для сопоставления с URI запроса.

Simple! Я делал это на PHP миллион раз. Дай или возьми.

Так вот что я делаю (для проверки):

> uri = '/users/#/status/*'
> uri.replace(/\//g, '\\/').replace(/#/g, '(\d+)').replace(/\*/g, '([^/]+)')

Что я делаю: 1) экранирование / и 2) замена # на \d+ и 3) замена * на [^/]+

В Chrome это работает как ожидалось:

< \/users\/(d+)\/status\/([^/]+)

Экранировал / и заменил # и * правильно. Это V8.

В Nodejs:

< \\/users\\/(d+)\\/status\\/([^/]+)

Que !? Каждый / удваивается? Я либо получил дважды сбежавший /, либо не избежал /.

Регулярное выражение верно, верно?

Я использую Chrome 15 dev (V8 javascript) и Node 0.5.8 dev (V8 javascript). Что здесь происходит?

Потенциально интересно
Если я тестирую /^\/users\/(\d+)\/status\/([^/]+)/.test('/users/1/status/x'), он возвращает true как в Chrome, так и в Node.

1 Ответ

5 голосов
/ 24 сентября 2011

Это связано с тем, что узел REPL отличается от консоли Chrome.Когда вы запускаете команду в Node, вы просматриваете экранированную строку (включая «невидимые» экранирующие символы), но когда вы видите ее в Chrome, это реальная оцененная строка с удаленными экранирующими символами.Это одни и те же строки, но Chrome пытается «предварительно откорректировать» их для вас.

Фактически, если вы копируете и вставляете полученную от Node строку в консоль Chrome (или даже FF Firebug), вы получите строку с одиночными побегами.Если вы скопируете и вставите его снова, он удалит символы перехода следующего уровня.

Консоль Chrome:

> "\\/users\\/(d+)\\/status\\/([^/]+)"
"\/users\/(d+)\/status\/([^/]+)"
> "\/users\/(d+)\/status\/([^/]+)"
"/users/(d+)/status/([^/]+)"
...