我正在构建一个路由器库,用于将简单定义的模式转换为正则表达式,以后可用于比较 url。这样就可以简单地定义规则,而库将负责其余的工作。
让我们假设字符串/*/#:id/#
被传递到库中,我想得到/^\/(.{1}.*)\/(?<id>[0-9]{1}[0-9]*)\/([0-9]{1}[0-9]*)$/i
. 最初,该库旨在处理仅转换*
和#
匹配任何文本 ( (.{1}.*)
) 和([0-9]{1}[0-9]+)
分别匹配数字 (),但现在我想包含命名特定匹配项的选项。做一个简单的字符串替换是行不通的。
最初我正在考虑让一个函数解析整个字符串,当遇到字符*
or#
时,它将检查下一个字符,如果是 a :
,它将继续直到a-z
遇到非字符,此时它将取那个短语,将其括在?<
and>
中,然后是先前找到的合适模式,最后将整个内容括在括号中,然后继续,但实际上,这不是最有效的方法,当我尝试定义时超过 50 条规则,处理时间大约需要 50 毫秒,当您认为这仍然是引导过程的一部分时,它似乎太长了,特别是当复杂的 web 应用程序可能有超过 200 条 url 规则时。
我已经看过正则表达式替换函数,但目前,它有点超出我的头脑......我不确定这是否是最好的解决方案,如果是一个解决方案。那么,有谁知道它是如何实现的,或者有一个更好的解决方案可以及时执行我正在尝试的事情?
额外的
我还应该注意,我包含的一些规则可能如下所示:
/*:init-test/#/*
这将匹配 url 之类的
/foo-test/123/asdf
/bar-test/456/jkl
我计划的另一条规则可能如下所示:
/*:init:test/#/*
这将匹配 url 之类的
/footest/123/asdf
/bartest/456/jkl