У меня есть серия строковых шаблонов qr // RegEx, соответствующих URL-адресам, поданным на мой сайт. Например, qr#^/safari/article/([0-9]+)\.html(\?(.*))?$#
. Эта строка будет соответствовать пути из URL, например /safari/article/299.html?parameter=1
. У меня есть отдельная подпрограмма, где я могу создавать URL-адреса для ссылки на различные части программы. Мне пришло в голову, что было бы неплохо, если бы эта последняя часть могла каким-то образом использовать вышеупомянутые шаблоны, которые я уже написал, - это уменьшило бы вероятность ошибки, если бы оба способа, с помощью которых были сгенерированы URL-адреса, и способ их последующей обработки происходили из одного и того же набор шаблонов.
Когда пользователь заходит на сайт, моя программа берет URL-адрес, предоставленный серверу, запускает его по строкам, подобным приведенным выше, и выводит $1
и $2
с шаблонами он находит (например, «299» и «параметр = 1», два параметра для загрузки страницы). По сути, теперь я хотел бы сделать это в обратном порядке и каким-то образом предоставить $1
и $2
и передать их в эту строку qr // для создания нового пути вывода (скажем, я бы установил $1
в "" 300 "и $2
to" parameter = 2 "каким-то образом объединить это со строкой qr // и получить вывод /safari/article/300.html?parameter=2
.
Есть ли простой способ сделать что-то вроде" обратного регулярного выражения " «Похоже, что один из способов сделать это - просто сопоставить шаблон с регулярными выражениями с этими двумя шаблонами в скобках, но мне это кажется неаккуратным. Есть ли более чистый способ?
РЕДАКТИРОВАТЬ: Одной из причин хранения шаблонов в RegEx является то, что все они выбрасываются в многомерный массив для последующей обработки, которая может помочь выяснить, какой модуль следует вызывать. Вот пара примеров элементов:
[
{ function => 'article', pattern => qr#^/safari/article/([0-9]+)\.html(\?(.*))?$#, weight => 106 },
{ function => 'topCommentedPosts', pattern => qr#^/safari/top\.html$#, weight => 100 }
]