捕获URL中的所有文件夹的正则表达式模式,包括正斜杠 [英] Regex pattern to capture all folders in URL including forward slash
本文介绍了捕获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屋!
查看全文