捕获URL中的所有文件夹的正则表达式模式,包括正斜杠 [英] Regex pattern to capture all folders in URL including forward slash

查看:0
本文介绍了捕获URL中的所有文件夹的正则表达式模式,包括正斜杠的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望匹配动态创建的URL,该URL可以有多个文件夹。这需要一些正则表达式模式。例如:

http://127.0.0.1:8000/api/:user_id/:foldersa/:folders1/
http://127.0.0.1:8000/api/:user_id/:foldersb/:folders2/:folders3/:folders4
http://127.0.0.1:8000/api/:user_id/:foldersc/:folders2/
http://127.0.0.1:8000/api/:user_id/:foldersd/:folders1/:folders2/

所以直到BASE_URL/api/:user_id/是很常见的。我可以捕获user_id,但希望在单个字符串变量上捕获user_id之后的其他参数。
之后,可以有任意数量的文件夹,我希望在一个字符串变量中捕获所有这些文件夹。
对于第一个URL,捕获的字符串变量将是"foldera/folder1/",而对于下一个URL,字符串变量将是"folderb/folder2/folder3/folder4"和fwd斜杠。

我应该在urls.py中编写什么正则表达式模式来捕获这些文件夹?
我试着用 re_path(r'(?P<user_id>[-w]+)/(?P<customUrl>(.*?)(?:/)?$)/.*', customLink, name='customLink'),

但无法使其工作。

推荐答案

您可以匹配除最后一个可选尾随斜杠之外的所有斜杠:

re_path(r'(?P<user_id>[-w]+)/(?P<custom_url>.*?)/?$', customLink, name='customLink'),

在视图中,您可以使用以下命令拆分端点:

def customLink(request, user_id, custom_url):
    endpoints = custom_url.split('/')
    # …

您还可以使用路径转换器:

# app_name/converters.py

class EndpointsConverter:
    regex = ".*?"
    
    def to_python(self, value):
        return value.split('/')
    
    def to_url(self, value):
        if isinstance(value, str):
            return value
        return '/'.join(value)

然后您可以使用路径转换器:

from django.urls import path, register_converter
from app_name.converters import EndpointsConverter

register_converter(EndpointsConverter, 'endpoints')

urlpatterns = [
    path('<str:user_id>/<endpoints:endpoints>/', customLink, name='customLink'),
    # …
]

这将自动按斜杠拆分(并联接)终结点。

这篇关于捕获URL中的所有文件夹的正则表达式模式,包括正斜杠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆