包含正斜杠的 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[0-9]+)/(?P[0-9]+(?:-|.|\/) +[a-zA-Z]+(?:-|.|\/)+[0-9])/(?P[^/]+)/$')【参考方案2】:

我无法弄清楚如何创建一个正则表达式,当它们有一个“/”时它会捕获参数。为了解决这个问题,我对参数进行了双重编码,这样在转到 URL 调度程序时它不会被完全解码。

感谢您的帮助, -C

【讨论】:

以上是关于包含正斜杠的 Django URL 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Django url 正则表达式命中 url: *./something

使用正则表达式替换仅保留正斜杠和数字

使用“new RegExp”和使用正斜杠符号创建正则表达式有啥区别?

正则表达式:在 Google Bigquery 中提取正斜杠后的所有内容?

MySQL 正则表达式用于在正文中查找带有双斜杠的内部 URL

匹配正则表达式中的可选斜杠