diff --git a/Dalamud/Utility/SeStringExtensions.cs b/Dalamud/Utility/SeStringExtensions.cs
index 4833bd629..7eac9160f 100644
--- a/Dalamud/Utility/SeStringExtensions.cs
+++ b/Dalamud/Utility/SeStringExtensions.cs
@@ -14,4 +14,18 @@ public static class SeStringExtensions
/// The original Lumina SeString.
/// The re-parsed Dalamud SeString.
public static SeString ToDalamudString(this Lumina.Text.SeString originalString) => SeString.Parse(originalString.RawData);
+
+ ///
+ /// Validate if character name is valid.
+ /// Both forename and surname must be between 2 and 15 characters and not total more than 20 characters combined.
+ /// Only letters, hyphens, and apostrophes can be used.
+ /// The first character of either name must be a letter.
+ /// Hyphens cannot be used in succession or placed immediately before or after apostrophes.
+ ///
+ /// character name to validate.
+ /// indicator if character is name is valid.
+ public static bool IsValidCharacterName(this SeString value)
+ {
+ return value.ToString().IsValidCharacterName();
+ }
}
diff --git a/Dalamud/Utility/StringExtensions.cs b/Dalamud/Utility/StringExtensions.cs
index 150f06c32..2cfb55fc0 100644
--- a/Dalamud/Utility/StringExtensions.cs
+++ b/Dalamud/Utility/StringExtensions.cs
@@ -1,4 +1,5 @@
using System.Diagnostics.CodeAnalysis;
+using System.Linq;
namespace Dalamud.Utility;
@@ -28,4 +29,38 @@ public static class StringExtensions
/// The string to test.
/// true if the value parameter is null or an empty string (""), or if value consists exclusively of white-space characters.
public static bool IsNullOrWhitespace([NotNullWhen(false)] this string? value) => string.IsNullOrWhiteSpace(value);
+
+ ///
+ /// Validate if character name is valid.
+ /// Both forename and surname must be between 2 and 15 characters and not total more than 20 characters combined.
+ /// Only letters, hyphens, and apostrophes can be used.
+ /// The first character of either name must be a letter.
+ /// Hyphens cannot be used in succession or placed immediately before or after apostrophes.
+ ///
+ /// character name to validate.
+ /// indicator if character is name is valid.
+ public static bool IsValidCharacterName(this string value)
+ {
+ if (string.IsNullOrEmpty(value)) return false;
+ if (value.Length > 21) return false; // add 1 to allow for space
+ var names = value.Split(' ');
+ if (names.Length != 2) return false;
+ var forename = names[0];
+ var surname = names[1];
+ if (!IsValidName(forename)) return false;
+ if (!IsValidName(surname)) return false;
+ return true;
+ }
+
+ private static bool IsValidName(string name)
+ {
+ if (name.Length is < 2 or > 15) return false;
+ if (name.Any(c => !char.IsLetter(c) && !c.Equals('\'') && !c.Equals('-'))) return false;
+ if (!char.IsLetter(name[0])) return false;
+ if (!char.IsUpper(name[0])) return false;
+ if (name.Contains("--")) return false;
+ if (name.Contains("\'-")) return false;
+ if (name.Contains("-\'")) return false;
+ return true;
+ }
}