2015-09-29 123 views
3

問題消毒的屬性名稱

我需要消毒的字符串從用戶輸入的收集到有效的屬性名稱的字符串。

語境

我們有一個與運行時生成的類工作的DataGrid中。這些類是基於一些參數生成的。參數名稱被轉換成屬性。其中一些參數名稱來自用戶輸入。我們實施了這一切,似乎一切都很好。我們對消毒串的邏輯是,只允許數字和字母,其餘轉換爲X.

const string regexPattern = @"[^a-zA-Z0-9]"; 
return ("X" + Regex.Replace(input, regexPattern, "X")); //prefix with X in case the name starts with a number 

屬性名稱總是正確的,我們存儲在字典中的原始字符串,所以我們仍然可以顯示友好的用戶參數名稱。

然而,麻煩就來了是當一個字符串只有在非法字符,這樣的區別:

參數名稱

PARAMETER_NAME

這些均被轉化爲:

ParameterXName

一個解決方案就是生成一些安全的,無關的名字,比如A,B C.等等。但是我更喜歡這個名字在調試時仍然可以被識別。除非當然實施這種行爲太複雜。

我看着StackOverflow的其他問題,但他們似乎都刪除了非法字符,它們有相同的問題。

我覺得我正在重新發明輪子。有沒有一些標準的解決方案或訣竅呢?

+0

你想要的東西一樣,如果存在三個字符串爲 「參數名」「 Parameter_Name「和」Parameter!Name「 輸出應該是ParameterAName ParameterBName ParameterCName –

+0

試試這個'[^ a-zA-Z0-9 _]'。注意空間和下劃線。請注意是否可用 –

+0

您可以存儲值對(參數名稱,用戶輸入) – Mariano

回答

3

我可以建議改在C#中產生安全,無關和識別的名稱

的algorythm _是成員名稱的有效符號。不是X

替換所有無效符號( chr

"_"+(short)chr+"_"

demo

public class Program 
{ 
    public static void Main() 
    { 
     string [] props = {"Parameter Name", "Parameter_Name"}; 

     var validNames = props.Select(s=>Sanitize(s)).ToList(); 
     Console.WriteLine(String.Join(Environment.NewLine, validNames)); 
    } 

    private static string Sanitize(string s) 
    { 
     return String.Join("", s.AsEnumerable() 
           .Select(chr => Char.IsLetter(chr) || Char.IsDigit(chr) 
               ? chr.ToString()  // valid symbol 
               : "_"+(short)chr+"_") // numeric code for invalid symbol 
         ); 
    } 
} 

打印

Parameter_32_Name 
Parameter_95_Name 
+0

正是我在找的東西,很棒!也不知道DotNetFiddle。這些東西非常有用。 – Martijn

+0

@MartijnvandenH,很好!使用數字對屬性名稱進行測試(例如,「123」,nov在c#中有效)並決定如何處理它們 – ASh