2016-06-10 2 views
0

Скажем, у меня есть большой список URL, который выглядит примерно так:Генерация простых шаблонов URL из списка примеров

foo.com/abc/123 
foo.com/abc/456 
foo.com/abc/789 
bar.com/11111/xyz 
bar.com/22222/xyz 
bar.com/33333/xyz 
etc. 

Я хотел бы, чтобы обработать этот список и производят очень простые Глобы подобные шаблоны , которые обобщают определенный сегмент пути, если в списке есть 3 или более URL-адреса, которые отличаются только этим сегментом пути. Обобщенный сегмент пути заменяется символом подстановки (*).

Таким образом, для приведенного выше списка, я хочу, чтобы моя программа для создания двух шаблонов:

foo.com/abc/* 
bar.com/*/xyz 

Обратите внимание, что обобщенный отрезок пути может появиться в любом месте в URL. Есть ли эффективный алгоритм для создания таких шаблонов? Мне не нужен полный генератор регулярных выражений.

+2

Является ли эффективность действительно проблемой? Вы действительно будете так часто это делать? Я бы сделал что-то вроде: для каждой строки пути в непревзойденном наборе {для каждого компонента {make wildcard; если 3 или более совпадений {make template; удалить совпадения из непревзойденного набора}}}. –

+0

Вы ищете эффективный способ создания шаблонов или эффективный способ поиска шаблонов, для которых должны быть созданы шаблоны? –

+0

Может ли * заменить несколько уровней папок? foo.com/abc/def/123 и foo.com/abc/123 становятся foo.com/*/123, например. – m69

ответ

0

Это зависит от того, насколько сложно вы хотите получить что-то. Замена сегмента довольно проста.

Давайте посмотрим сначала на простейший случай: общие префиксы, как в вашем примере для 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.

Смежные вопросы