2012-08-23 21 views
1

我正在遷移遺留的PHP應用程序到.net,其中一個要求是URL保持與以前完全一樣。php的str_word_count到c#的端口#

要生成友好的URL,遺留應用程序使用str_word_count,我想知道是否有這個函數的端口到C#?

+0

AFAIK有否b用C#做到這一點。不過,你可以寫一些相當簡單的東西。 – Matt

+0

[請查看我的谷歌搜索結果](https://www.google.com/webhp?sourceid=chrome-instant&ie=UTF-8&ion=1#hl=zh-CN&sclient=psy-ab&q=c%23+word+count+功能和OQ = C%+ 23 +字計數+功能&gs_l = hp.3..0i30.2799.15398.0.15584.45.25.11.5.5.2.320.4450.0j16j7j1.24.0.les%3B..0.0 ... 1c.jTOzzkTEyAA&PBX = 1&BAV = on.2,or.r_gc.r_pw.r_cp.r_qf。&fp = f0056a833a456726&ion = 1&biw = 1280&bih = 939) – Matt

+0

您是否需要支持各種語言環境(即特殊字符,如é),還是西文字母足夠了希望如此,如果這與URL有關)。無論如何,我會發布我的答案。 –

回答

4

好吧,這裏是我的「壞的C#」示例(在混合返回類型中模仿PHP)。這是一個相當簡單的實現,利用.NET的正則表達式。

private enum WORD_FORMAT 
{ 
    NUMBER = 0, 
    ARRAY = 1, 
    ASSOC = 2 
}; 

private static object str_word_count(string str, WORD_FORMAT format, string charlist) 
{ 
    string wordchars = string.Format("{0}{1}", "a-z", Regex.Escape(charlist)); 

    var words = Regex.Matches(str, string.Format("[{0}]+(?:[{0}'\\-]+[{0}])?", wordchars), RegexOptions.Compiled | RegexOptions.IgnoreCase); 

    if (format == WORD_FORMAT.ASSOC) 
    { 
     var assoc = new Dictionary<int, string>(words.Count); 
     foreach (Match m in words) 
      assoc.Add(m.Index, m.Value); 
     return assoc; 
    } 
    else if (format == WORD_FORMAT.ARRAY) 
    { 
     return words.Cast<Match>().Select(m => m.Value).ToArray(); 
    } 
    else // default to number. 
    { 
     return words.Count; 
    } 
} 

所以函數會返回一個Dictionary<int,string>如果你選擇ASSOC,一個string[]如果你選擇ARRAY和簡單int如果你選擇NUMBER

一個例子(我複製PHP的例子here

static void Main(string[] args) 
{ 
    string sentence = @"Hello fri3nd, you're 
    looking   good today!"; 

    var assoc = (Dictionary<int,string>)str_word_count(sentence, WORD_FORMAT.ASSOC, string.Empty); 
    var array = (string[])str_word_count(sentence, WORD_FORMAT.ARRAY, string.Empty); 
    var number = (int)str_word_count(sentence, WORD_FORMAT.NUMBER, string.Empty); 

    //test the plain array 
    Console.WriteLine("Array\n("); 
    for (int i = 0; i < array.Length; i++) 
     Console.WriteLine("\t[{0}] => {1}", i, array[i]); 
    Console.WriteLine(")"); 
    // test the associative 
    Console.WriteLine("Array\n("); 
    foreach (var kvp in assoc) 
     Console.WriteLine("\t[{0}] => {1}", kvp.Key, kvp.Value); 
    Console.WriteLine(")"); 
    //test the charlist: 
    array = (string[])str_word_count(sentence, WORD_FORMAT.ARRAY, "àáãç3"); 
    Console.WriteLine("Array\n("); 
    for (int i = 0; i < array.Length; i++) 
     Console.WriteLine("\t[{0}] => {1}", i, array[i]); 
    Console.WriteLine(")"); 
    //test the number 
    Console.WriteLine("\n{0}", number); 
    Console.Read(); 
} 

但是,我想在此處添加註釋:不要返回對象它的工作原理AOK用PHP,因爲它不是一個強類型語言。真的,你應該寫功能的各個版本,以配合每個不同格式不管怎麼說,這應該讓你開始:)

輸出:

Array 
(
    [0] => Hello 
    [1] => fri 
    [2] => nd 
    [3] => you're 
    [4] => looking 
    [5] => good 
    [6] => today 
) 
Array 
(
    [0] => Hello 
    [6] => fri 
    [10] => nd 
    [14] => you're 
    [25] => looking 
    [42] => good 
    [47] => today 
) 
Array 
(
    [0] => Hello 
    [1] => fri3nd 
    [2] => you're 
    [3] => looking 
    [4] => good 
    [5] => today 
) 

7 
+0

而不是使用字典,爲什麼你不能使用數組?它是否總是增加1? –

+0

關聯性詞典。它將單詞索引映射到單詞本身,也可以使用HashMap或類似的東西,但不是數組。當請求的格式是一個數組時,我會返回一個數組。 –