包含正斜杠的 Django URL 正则表达式
Posted
技术标签:
【中文标题】包含正斜杠的 Django URL 正则表达式【英文标题】:Django URL regex to include forward slashes 【发布时间】:2018-09-21 16:26:16 【问题描述】:我在创建允许所有字符(包括正斜杠)的 Django URL 正则表达式时遇到问题。更具体地说,我遇到的问题是区分 URL args 中使用的正斜杠和 URL 中用作分隔符的正斜杠。
示例:
我有一个如下所示的 URL: localhost:8000/jfe/customer/customerNumb/invoice2/portfolio/
这由 3 个 URL 参数组成: 客户麻木, 发票2, 投资组合。
我的目标是让参数 2 可以包含特殊字符,包括“/”,因此第二个参数可能类似于“KJ 02/2017”(不带引号)。
示例: localhost:8000/jfe/customer/customerNumb/KJ 02/2017/portfolio/
在使用“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/portfolio/
当我想要的时候:
arg1: customerNumb arg2: KJ%2002%2F2017 arg3: 投资组合
有人可以帮助我了解我的正则表达式在哪里搞砸了吗?或者让我知道是否有可能在 url 参数中包含“/”?
谢谢
编辑: 有人指出我的第二次尝试有效,这是真的,但我想提一下 Django 似乎在将 URL 传递给正则表达式之前对其进行解码。结果,正则表达式将其视为:
localhost:8000/jfe/customer/customerNumb/KJ 02/2017/portfolio/
【问题讨论】:
你不应该那样做 如果你的意思是我的论点中不应该有“/”,我同意,但这是业务需求,所以我无能为力。 您的第二次尝试seems to work。我还尝试了未编码的字符串,结果相同。 保罗你是对的。我认为问题在于 Django 在将 URL 传递给正则表达式之前对其进行解码。 this question 有帮助吗? 【参考方案1】:这样不行吗
"/[0-9]+(?:-|.|\/)+[a-zA-Z]+(?:-|.|\/)+[0-9]/"
【讨论】:
感谢帕迪的回复。我试了一下,但无法识别 URL 模式。这就是它的样子: url(r'^customer/(?P我无法弄清楚如何创建一个正则表达式,当它们有一个“/”时它会捕获参数。为了解决这个问题,我对参数进行了双重编码,这样在转到 URL 调度程序时它不会被完全解码。
感谢您的帮助, -C
【讨论】:
以上是关于包含正斜杠的 Django URL 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
Django url 正则表达式命中 url: *./something
使用“new RegExp”和使用正斜杠符号创建正则表达式有啥区别?
正则表达式:在 Google Bigquery 中提取正斜杠后的所有内容?