Escape Markup

Safely display user input, array indexers, and JSON without markup parsing errors

When displaying dynamic content that might contain square brackets, escape it to prevent markup parsing errors.

Escape User Input

To safely display user-provided strings, use Markup.Escape().

// User input that contains brackets
var userInput = "Use [brackets] for indexing";
var escaped = Markup.Escape(userInput);
  
// Safe to use in markup string
AnsiConsole.MarkupLine($"[blue]Input:[/] {escaped}");
  
// Common patterns that need escaping
var configKey = "settings[debug]";
var arrayRef = "items[0]";
  
AnsiConsole.MarkupLine($"[green]Config:[/] {Markup.Escape(configKey)}");
AnsiConsole.MarkupLine($"[green]Array:[/] {Markup.Escape(arrayRef)}");

Use Safe Interpolation

For cleaner code with multiple dynamic values, use MarkupLineInterpolated() which escapes automatically.

// Values that contain brackets are escaped automatically
var fileName = "config[backup].json";
var userName = "admin[test]";
var version = "v2.0[beta]";
  
// No manual escaping needed
AnsiConsole.MarkupLineInterpolated($"[blue]File:[/] {fileName}");
AnsiConsole.MarkupLineInterpolated($"[green]User:[/] {userName}");
AnsiConsole.MarkupLineInterpolated($"[yellow]Version:[/] {version}");
  
// Works with multiple interpolated values
AnsiConsole.MarkupLineInterpolated(
    $"[dim]Loaded[/] {fileName} [dim]for user[/] {userName}");

Strip Markup for Plain Text

To get plain text without markup tags (for logging or file output), use Markup.Remove().

var styled = "[bold red]Error:[/] Connection to [blue]database[/] failed";
  
// Remove all markup tags for plain text
var plain = Markup.Remove(styled);
  
AnsiConsole.MarkupLine("[dim]Styled output:[/]");
AnsiConsole.MarkupLine(styled);
  
AnsiConsole.MarkupLine("[dim]Plain text for logs:[/]");
AnsiConsole.WriteLine(plain);

See Also