Замена вложенных строк регулярным выражением в powershell

#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