Вопрос или проблема
У меня есть строка запроса, похожая на следующую:
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
Заключение
Оба метода подходят для решения вашей задачи. Первый метод прост и быстр, второй — более надежный и предоставляет дополнительные возможности для работы с параметрами. Выберите тот, который лучше соответствует вашим требованиям.