33658


URLが

[code]

    // http://wonderland.com/street/愛媛県
    app.get(/^\/street\/.{1,50}$/)
    console.log(req.params[0])
    // 愛媛県
    // パスが通る
    
[/code]

となる場合はOKですが、  
下記のようにもし`/id/数値`が入っていても処理するにはどうすればよいでしょうか？

[code]

    // http://wonderland.com/street/Улаанбаатар/id/1230515654
    app.get(/^\/street\/(.{1,50}$)(\/id\/([0-9]{1,3}$))?$/)
    console.log(req.params[0])
    // Улаанбаатар/id/1230515654
    // 4桁以上でもパスが通ってしまう
    
[/code]

やりたいことは

[code]

    /street/(記号以外の日本語や英語、数字、外国語50文字以内)
    /street/(記号以外の日本語や英語、数字、外国語50文字以内)/id/(数字3桁)
    
[/code]

です。なるべくセキュアにしたいのですがstreetのあとの文字列は\w{1,50}では都合がわるかったのでドットを使用しました。

> `\w`  
>  単語に使用される任意の文字と一致します。アンダースコアも含まれます。'[A-Za-z0-9_]' と同じ意味になります。
>
> `.`  
>  "\n" を除く任意の 1 文字に一致します。'\n' など、任意の文字と一致するには、'[.\n]' などのパターンを指定します。

また、正規表現を使うとややこしうなるので`req.params.name :name`などは使用しておりません。


CC BY-SA 3.0
2017-03-30T15:56:56.407
33657
2017-03-30T17:10:18.760
7973
question
node.js 正規表現
NodeJS Express 正規表現 何桁でもパスが通ってしまう


※ コメント欄からの転記になります(一部文言を変更)

セパレータが `/` ですので、

[code]

    /^\/street\/([^/]{1,50})(\/id\/([0-9]{1,3}))?$/
    
[/code]

としてみてはどうでしょう。


CC BY-SA 3.0
2017-03-30T17:10:18.760
33658
2017-03-30T17:10:18.760
33657
answer