Это зависит от того, насколько сложно вы хотите получить что-то. Замена сегмента довольно проста.
Давайте посмотрим сначала на простейший случай: общие префиксы, как в вашем примере для foo.com.
Позволь мне расширить ваш пример немного:
foo.com/abc/123
foo.com/abc/456
foo.com/abc/789
foo.com/123/abc
foo.com/123/def
foo.com/123/ghi
Что мы собираемся сделать, это построить иерархию (дерево) с foo.com сверху, и двое детей: а и 123. Каждый из детей будет иметь три дочерних узла. Так что у вас есть:
foo.com
abc
123
456
789
123
abc
def
ghi
Это легко написать рекурсивную программу, которая пересекает эту структуру, чтобы найти родителей с листовыми узлами, а затем решить, если вы хотите сделать шаблон. Как вы принимаете это решение, неясно. Возможно, вы говорите, что если узел имеет трех или более детей, вы создаете для него шаблон. Итак, здесь у вас будет foo.com/abc/*
и foo.com/123/*
.
Но вы можете также:
foo.com/abc/123/barby
foo.com/abc/123/fooby
foo.com/abc/123/foobidity
Вы могли бы тогда хотеть дополнительное правило: foo.com/abc/123/*
Вы можете найти эти общие последовательности, основанные на общих подстрок очень легко.
Вы можете расширить этот метод, изменив свои URL-адреса. Таким образом, учитывая ваш пример bar.com:
bar.com/11111/xyz
bar.com/22222/xyz
bar.com/33333/xyz
Вы преобразовать URL, чтобы:
bar.com/xyz/11111
bar.com/xyz/22222
bar.com/xyz/33333
Затем пройти через иерархии строительного процесса снова. Но здесь вы хотите убедиться, что существует ровно столько же «xyz», сколько предметов во втором сегменте. Например, если бы был четвертый URL-адрес, bar.com/4444/xyz
, вы бы не захотели сгенерировать шаблон «bar.com/*/xyz»
Этот метод прост и весьма эффективен, если вы ищете сегментную модели замещения. Это разумно эффективно, если количество сегментов на один URL не очень велико. Но если у вас есть сайт с более чем, скажем, полдюжиной уровней иерархии, у вас, вероятно, есть другие проблемы. Или нет. Эти сайты обычно уже имеют общую структуру, которую вы можете использовать.Такие вещи, как bigblogsite.com/user-name/section/year/month/day/title.
Это сложнее, если вы ищете двухсегментную замену, особенно если два сегмента не смежны. Например, пытаясь найти fooby.com/ /xyz//barby.
Является ли эффективность действительно проблемой? Вы действительно будете так часто это делать? Я бы сделал что-то вроде: для каждой строки пути в непревзойденном наборе {для каждого компонента {make wildcard; если 3 или более совпадений {make template; удалить совпадения из непревзойденного набора}}}. –
Вы ищете эффективный способ создания шаблонов или эффективный способ поиска шаблонов, для которых должны быть созданы шаблоны? –
Может ли * заменить несколько уровней папок? foo.com/abc/def/123 и foo.com/abc/123 становятся foo.com/*/123, например. – m69