Django URL 正则表达式包含正斜杠
Django URL regex to include forward slashes
我在创建允许所有字符(包括正斜杠)的 Django URL 正则表达式时遇到问题。更具体地说,我遇到的问题是区分 URL args 中使用的正斜杠和 URL 中用作定界符的正斜杠。
示例:
我有一个 URL 看起来像这样:
localhost:8000/jfe/customer/customerNumb/invoice2/portfolio/
这包含 3 个 URL 个参数:
customerNumb,
发票2,
投资组合。
我的目标是使参数 2 可以包含特殊字符,包括“/”,因此第二个参数可以类似于 "KJ 02/2017"(不带引号)。
示例:
localhost:8000/jfe/customer/customerNumb/KJ 02/2017/组合/
在使用 "KJ 02/2017" 的示例中,我无法区分 "KJ 02/2017" 中的“/”和分隔 arg2 和 arg3 的“/”。
我的正则表达式:
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>[^/]+)/$')
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>[^/]+)/(?P<portfolio>[^/]+)/$')
我也试过了
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>.+)/$')
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>.+)/(?P<portfolio>[^/]+)/$')
如果我对 URL 进行编码:
示例:localhost:8000/jfe/customer/customerNumb/KJ%2002%2F2017/portfolio/
正则表达式将像这样解析它:
arg1: customerNumb,
arg2:KJ%2002%2F2017/投资组合/
当我想要的时候:
arg1: 客户编号
arg2:KJ%2002%2F2017
arg3: 投资组合
有人可以帮助我了解我在正则表达式中搞砸的地方吗?或者让我知道是否可以在 url 参数中包含“/”?
谢谢
编辑:
有人指出我的第二次尝试有效,这是真的,但我想提一下 Django 似乎在将 URL 传递给正则表达式之前对其进行解码。结果,正则表达式将其视为:
localhost:8000/jfe/customer/customerNumb/KJ 02/2017/组合/
这应该有效:
"/[0-9]+(?:-|.|\/)+[a-zA-Z]+(?:-|.|\/)+[0-9]/"
我无法弄清楚如何创建一个正则表达式来捕获带有“/”的参数。为了解决这个问题,我对参数进行了双重编码,这样当转到 URL 调度程序时它就不会被完全解码。
我在创建允许所有字符(包括正斜杠)的 Django URL 正则表达式时遇到问题。更具体地说,我遇到的问题是区分 URL args 中使用的正斜杠和 URL 中用作定界符的正斜杠。
示例:
我有一个 URL 看起来像这样: localhost:8000/jfe/customer/customerNumb/invoice2/portfolio/
这包含 3 个 URL 个参数: customerNumb, 发票2, 投资组合。
我的目标是使参数 2 可以包含特殊字符,包括“/”,因此第二个参数可以类似于 "KJ 02/2017"(不带引号)。
示例: localhost:8000/jfe/customer/customerNumb/KJ 02/2017/组合/
在使用 "KJ 02/2017" 的示例中,我无法区分 "KJ 02/2017" 中的“/”和分隔 arg2 和 arg3 的“/”。
我的正则表达式:
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>[^/]+)/$')
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>[^/]+)/(?P<portfolio>[^/]+)/$')
我也试过了
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>.+)/$')
url(r'^customer/(?P<customer_number>[0-9]+)/(?P<invoice>.+)/(?P<portfolio>[^/]+)/$')
如果我对 URL 进行编码:
示例:localhost:8000/jfe/customer/customerNumb/KJ%2002%2F2017/portfolio/ 正则表达式将像这样解析它:
arg1: customerNumb, arg2:KJ%2002%2F2017/投资组合/
当我想要的时候:
arg1: 客户编号 arg2:KJ%2002%2F2017 arg3: 投资组合
有人可以帮助我了解我在正则表达式中搞砸的地方吗?或者让我知道是否可以在 url 参数中包含“/”?
谢谢
编辑: 有人指出我的第二次尝试有效,这是真的,但我想提一下 Django 似乎在将 URL 传递给正则表达式之前对其进行解码。结果,正则表达式将其视为:
localhost:8000/jfe/customer/customerNumb/KJ 02/2017/组合/
这应该有效:
"/[0-9]+(?:-|.|\/)+[a-zA-Z]+(?:-|.|\/)+[0-9]/"
我无法弄清楚如何创建一个正则表达式来捕获带有“/”的参数。为了解决这个问题,我对参数进行了双重编码,这样当转到 URL 调度程序时它就不会被完全解码。