Как получить параметры из строки запроса, начиная с определенной позиции в PowerShell?

Вопрос или проблема

У меня есть строка запроса, похожая на следующую:

https://www.shoes.com/men-shoes/sneakers/?cgid=men-shoes- 
sneakers&prefn1=refinementColor&prefv1=White&detail=acme&id=12345

Я хочу получить все от &prefn1 до конца строки, поэтому результат будет таким:

&prefn1=refinementColor&prefv1=White&detail=acme&id=12345

Как я могу сделать это в PowerShell?

Шаблон замены, например, ^[^&]+, вероятно, сработает:

$uri = 'https://www.shoes.com/men-shoes/sneakers/?cgid=men-shoes-sneakers&prefn1=refinementColor&prefv1=White&detail=acme&id=12345'
$uri -replace '^[^&]+'

Тем не менее, если вы хотите что-то более надежное, вы можете преобразовать вашу строку в объект Uri и оттуда вы сможете извлечь запрос из свойства .Query и использовать ParseQueryString для получения коллекции имен/значений:

Add-Type -AssemblyName System.Web
$uri = [uri] 'https://www.shoes.com/men-shoes/sneakers/?cgid=men-shoes-sneakers&prefn1=refinementColor&prefv1=White&detail=acme&id=12345'
$query = [System.Web.HttpUtility]::ParseQueryString($uri.Query)
$query.AllKeys | ForEach-Object {
    [pscustomobject]@{
        Key   = $_
        Value = $query[$_]
    }
}

Ответ или решение

Чтобы извлечь параметры из строки запроса, начиная с определенной позиции, вы можете воспользоваться средствами PowerShell. В данном случае, чтобы получить все параметры запроса, начиная с &prefn1, можно использовать несколько подходов. Ниже я представлю оба метода: с использованием регулярных выражений и с использованием объекта Uri.

Метод 1: Использование Регулярных Выражений

Вы можете использовать регулярное выражение для извлечения необходимого сегмента строки. Для вашей строки это будет выглядеть следующим образом:

$uri = 'https://www.shoes.com/men-shoes/sneakers/?cgid=men-shoes-sneakers&prefn1=refinementColor&prefv1=White&detail=acme&id=12345'
$result = $uri -replace '^.*?(&prefn1.*)$', '$1'
Write-Output $result

В этом примере регулярное выражение ^.*?(&prefn1.*)$ ищет все символы до &prefn1 и захватывает все после этого. Результат будет:

&prefn1=refinementColor&prefv1=White&detail=acme&id=12345

Метод 2: Использование объекта Uri и HttpUtility

Этот метод более надежен и позволяет обрабатывать параметры запроса в виде коллекции ключ-значение. Для этого вам потребуется добавить сборку System.Web и воспользоваться классом HttpUtility:

Add-Type -AssemblyName System.Web
$uri = [uri] 'https://www.shoes.com/men-shoes/sneakers/?cgid=men-shoes-sneakers&prefn1=refinementColor&prefv1=White&detail=acme&id=12345'
$query = [System.Web.HttpUtility]::ParseQueryString($uri.Query)

$result = @()
$startCollecting = $false

foreach ($key in $query.AllKeys) {
    if ($key -eq 'prefn1') {
        $startCollecting = $true
    }
    if ($startCollecting) {
        $result += "$key=$($query[$key])"
    }
}

# Соединяем параметры обратно в строку
$finalResult = '&' + ($result -join '&')
Write-Output $finalResult

В этом примере мы перебираем все ключи в коллекции параметров. Как только находим prefn1, начинаем добавлять все последующие параметры в массив. В конце мы соединяем их обратно в строку.

Результат будет тем же:

&prefn1=refinementColor&prefv1=White&detail=acme&id=12345

Заключение

Оба метода подходят для решения вашей задачи. Первый метод прост и быстр, второй — более надежный и предоставляет дополнительные возможности для работы с параметрами. Выберите тот, который лучше соответствует вашим требованиям.

Оцените материал
Добавить комментарий

Капча загружается...