#regex #powershell
#регулярное выражение #powershell
Вопрос:
В моем powershell есть следующий код регулярного выражения для определения URL-адресов, которые мне нужно обновить:
'href[s]?=[s]?"[^"]*(https://oursite.org/[^"]*News and Articles[^"]*) "'
'href[s]?=[s]?"[^"]*(https://oursite.org/[^"]*en/News-and-Articles[^"]*) "'
Это дает мне результаты, которые мне нужно обновить, теперь мне нужно знать, как заменить значения «Новости и статьи» на «news-and-articles» и «ru» на «news-and-articles».
У меня есть некоторый код, который имеет заменяющий URL-адрес следующим образом:
$newUrl = 'href="https://oursite.org/"' #replaced value
Таким образом, начальный результат был бы:
https://www.oursite.org/en/News-and-Articles/2017/11/article-name
подлежит замене на
https://www.oursite.org/news-and-articles/2017/11/article-name
Вот функция, которая просматривает все статьи и выполняет замену:
function SearchItemForMatch
{
param(
[Data.Items.Item]$item
)
Write-Host "------------------------------------item: " $item.Name
foreach($field in $item.Fields) {
#Write-Host $field.Name
if($field.Type -eq "Rich Text") {
#Write-Host $field.Name
if($field.Value -match $pattern) {
ReplaceFieldValue -field $field -needle $pattern -replacement $newUrl
}
#if($field.Value -match $registrationPattern) {
# ReplaceFieldValue -field $field -needle $registrationPattern -replacement $newRegistrationUrl
#}
if($field.Value -match $noenpattern){
ReplaceFieldValue -field $field -needle $noenpattern -replacment $newnoenpattern
}
}
}
}
Вот метод замены:
Function ReplaceFieldValue
{
param (
[Data.Fields.Field]$field,
[string]$needle,
[string]$replacement
)
Write-Host $field.ID
$replaceValue = $field.Value -replace $needle, $replacement
$item = $field.Item
$item.Editing.BeginEdit()
$field.Value = $replaceValue
$item.Editing.EndEdit()
Publish-Item -item $item -PublishMode Smart
$info = [PSCustomObject]@{
"ID"=$item.ID
"PageName"=$item.Name
"TemplateName"=$item.TemplateName
"FieldName"=$field.Name
"Replacement"=$replacement
}
[void]$list.Add($info)
}
Ответ №1:
Простите меня, если я что-то упускаю, но мне кажется, что все, чего вы действительно хотите добиться, это избавиться от /en
части и, наконец, преобразовать весь URL в нижний регистр.
Учитывая ваш пример URL, это может быть так же просто, как:
$url = 'https://www.oursite.org/en/News-and-Articles/2017/11/article-name'
$replaceValue = ($url -replace '/en/', '/').ToLower()
Результат:
https://www.oursite.org/news-and-articles/2017/11/article-name
Если это требует более сложных замен, то, пожалуйста, отредактируйте свой вопрос и предоставьте нам больше примеров и желаемый результат.
Ответ №2:
Попробуйте регулярное выражение: (?<=oursite.org/)(?:en/)?News-and-Articles(?=/)
Заменить на news-and-articles
Комментарии:
1. Простите меня за мое невежество, как бы мне подключить это к имеющемуся у меня коду? Извините, я унаследовал это, у меня практически нет опыта работы с powershell