Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Ответ на оригинальный вопрос.
Код: Выделить весь код
[Uri[]]$u = 'https://site.com/user/anything/anything','https://anything.site.com/anything-anything-12345678/anything','https://anything.site.com/'
"https://$(($$ = $u[2].Host).Substring(0, $$.IndexOf('.'))).site.com/$(-join$u[0,1].ForEach{$_.Segments[1].Split('-')[-1]})"

Что касается сценариев разбора, если количество сегментов в URL всегда фиксировано:
Код: Выделить весь код
[Uri[]]$u = 'https://site.com/user/anything/anything','https://anything.site.com/anything-anything-12345678/anything','https://anything.site.com'
# массив сценариев (скрипт-блоков), что нужно сделать в том или ином случае
$scenario = {'subdomaincheck'},{},{'postcheck'},{'usercheck'}
$u.ForEach{$scenario[$_.Segments.Count - 1]}
Если же количество сегментов URL не является постоянной величиной, но при этом сохраняются позиции указанных опорных точек (и их формат), можно нарисовать примерно следующую функцию:
Код: Выделить весь код
#requires -version 7
function Get-UrlType {
  [CmdletBinding(DefaultParameterSetName='Url')]
  param(
    [Parameter(Mandatory, ParameterSetName='Url', Position=0)]
    [ValidateNotNullOrEmpty()]
    [Uri[]]$Url,

    [Parameter(Mandatory, ParameterSetName='Raw', Position=0)]
    [ValidateNotNullOrEmpty()]
    [String[]]$Raw
  )

  end {
    $scope = $PSCmdlet.ParameterSetName -eq 'Raw' ? [Uri[]]$Raw : $Url
    $scope.ForEach{
      $_.Host.Split('.').Count -eq 2 ? $(
        'User: {0}' -f $_.Segments[1].Trim('/')
      ) : $(
        $_.Segments.Count -eq 1 ? $(
          'Subdomain: {0}' -f $_.Host.Substring(0, $_.Host.IndexOf('.'))
        ) : $(
          'Code: {0}' -f $_.Segments[1].Split([Char[]]@('-', '/'))[-2]
        )
      )
    } # foreach
  }
}
Вне зависимости от того, передаётся ли в функцию массив URI или просто строк, функция будет обрабатывать поступающие на вход данные как URI. В цикле для каждого элемента массива, передаваемого функции, выстраивается следующая логика:
1) если хост назначения состоит из двух элементов (вида site.com), следовательно в данном URL ищем юзера
2) в противном случае, если количество сегментов - единица, искать субдомен
3) иначе вытащить из второго сегмента URL цифровое значение
Таким образом:
Код: Выделить весь код
$u = 'https://site.com/user/anything/anything',
     'https://anything.site.com/anything-anything-12345678/anything',
     'https://anything.site.com'
Get-UrlType $u
Выдаст:
Код: Выделить весь код
User: user
Code: 12345678
Subdomain: anything
Альтернативное решение задачи, при условии, что site.com во всех трёх случаях постоянно, можно представить через объединение URI с "хирургией" через обобщённый делегат. Правда это уже более функциональный стиль, а здесь, на форуме, повсеместно императивщина.

Последний раз редактировалось greg zakharov, 11-09-2020 в 19:09.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:29, 11-09-2020 | #12