Public/Support/Helper/Format-StringRemoveSpecialCharacter.ps1

# Module: TeamsFunctions
# Function: Support
# Author: Francois-Xavier Cat
# Updated: 03-MAY-2020
# Status: Live




function Format-StringRemoveSpecialCharacter {
  <#
  .SYNOPSIS
    This function will remove the special character from a string.
  .DESCRIPTION
    This function will remove the special character from a string.
    I'm using Unicode Regular Expressions with the following categories
    \p{L} : any kind of letter from any language.
    \p{Nd} : a digit zero through nine in any script except ideographic
    http://www.regular-expressions.info/unicode.html
    http://unicode.org/reports/tr18/
  .PARAMETER String
    Specifies the String on which the special character will be removed
  .PARAMETER SpecialCharacterToKeep
    Specifies the special character to keep in the output
  .EXAMPLE
    Format-StringRemoveSpecialCharacter -String "^&*@wow*(&(*&@"
 
    wow
  .EXAMPLE
    Format-StringRemoveSpecialCharacter -String "wow#@!`~)(\|?/}{-_=+*"
 
    wow
  .EXAMPLE
    Format-StringRemoveSpecialCharacter -String "wow#@!`~)(\|?/}{-_=+*" -SpecialCharacterToKeep "*","_","-"
 
    wow-_*
  .INPUTS
    System.String
  .OUTPUTS
    System.String
  .NOTES
    Originally written by:
    Francois-Xavier Cat
    @lazywinadmin
    lazywinadmin.com
    github.com/lazywinadmin
  .COMPONENT
    SupportingFunction
  .FUNCTIONALITY
    Reformats a string to be used; Removes special Characters in the process
  .LINK
    https://github.com/DEberhardt/TeamsFunctions/tree/main/docs/Format-StringRemoveSpecialCharacter.md
  .LINK
    https://github.com/DEberhardt/TeamsFunctions/tree/main/docs/about_Supporting_Functions.md
  .LINK
    https://github.com/DEberhardt/TeamsFunctions/tree/main/docs/
  #>


  [CmdletBinding()]
  [OutputType([String])]
  param
  (
    [Parameter(Mandatory, Position = 0, ValueFromPipeline, HelpMessage = 'String to reformat')]
    [ValidateNotNullOrEmpty()]
    [Alias('Text')]
    [System.String[]]$String,

    [Alias('Keep')]
    #[ValidateNotNullOrEmpty()]
    [String[]]$SpecialCharacterToKeep
  ) #param

  begin {
    Show-FunctionStatus -Level Live
    #Write-Verbose -Message "[BEGIN ] $($MyInvocation.MyCommand)"


  } #begin

  process {
    Write-Verbose -Message "[PROCESS] $($MyInvocation.MyCommand)"
    try {
      if ($PSBoundParameters['SpecialCharacterToKeep']) {
        $Regex = '[^\p{L}\p{Nd}'
        foreach ($Character in $SpecialCharacterToKeep) {
          if ($Character -eq '-') {
            $Regex += '-'
          }
          else {
            $Regex += [Regex]::Escape($Character)
          }
          #$Regex += "/$character"
        }

        $Regex += ']+'
      } #IF($PSBoundParameters["SpecialCharacterToKeep"])
      else { $Regex = '[^\p{L}\p{Nd}]+' }

      foreach ($Str in $string) {
        Write-Verbose -Message "Original String: $Str"
        $Str -replace $regex, ''
      }
    }
    catch {
      $PSCmdlet.ThrowTerminatingError($_)
    }
  } #process

  end {
    #Write-Verbose -Message "[END ] $($MyInvocation.MyCommand)"
  } #end
} #Format-StringRemoveSpecialCharacter