/// <summary> /// text内に含まれているレス参照の番号をすべて数値配列に変換 /// (例: http://.../10-20 → 10,11,12...20) /// </summary> /// <param name="text"></param> /// <returns></returns> public static int[] GetArray(string text) { if (text == null) { throw new ArgumentNullException("text"); } if (Regex.IsMatch(text, @"/\d{5,}/?$") || Regex.IsMatch(text, "(=|l)\\d+$")) // "/50l" などは無視する { return(new int[0]); } ArrayList list = new ArrayList(); Match m = RefRegex.Match( HtmlTextUtility.ZenToHan(text)); if (m.Success) { string[] numbers = m.Groups["num"].Value.Split(",+".ToCharArray()); foreach (string num in numbers) { string[] array = num.Split('-'); if (array.Length == 2) { int st = 0, ed = 0; // 数字かどうかをチェック if (Int32.TryParse(array[0], out st)) { // "100-" (100番目以降) という数字の場合、array[1] には空文字列が格納される。 // この形式の場合は 100番目から最後のレス(1001番目)までを含めるようにする if (array[1] == String.Empty) { ed = 1001; } else { Int32.TryParse(array[1], out ed); } if (st >= 1 && (ed - st) <= 1000) { for (int i = st; i <= ed; i++) { list.Add(i); } } } } else if (array.Length == 1) { if (HtmlTextUtility.IsDigit(array[0])) { int n; if (Int32.TryParse(array[0], out n)) { list.Add(n); } } } } } return((int[])list.ToArray(typeof(int))); }
private StringBuilder CreateHtml(string skinhtml, ResSet resSet) { StringBuilder sb = new StringBuilder(2048); string number; string name; string mailname; string dateonly, dateString; string body; #region メニュー付き番号の作成 int iPos = -1; sb.Append("<a href=\"menu:"); sb.Append(resSet.Index); sb.Append("\" name=\""); sb.Append(resSet.Index); sb.Append("\" target=\"_blank\">"); iPos = sb.Length; sb.Append(resSet.Index); if (resSet.IsServerAboned) { sb.Insert(iPos, "<font color=lime><i>"); sb.Append("</i></font>"); } sb.Append("</a>"); number = sb.ToString(); sb.Remove(0, sb.Length); #endregion #region 前の作成 sb.Append("<b>"); sb.Append(resSet.Name); sb.Append("</b>"); name = sb.ToString(); sb.Remove(0, sb.Length); #endregion #region 前欄ポップアップ string _resName = String.Empty; if (!String.IsNullOrEmpty(resSet.Name)) { if (namePopup && Char.IsDigit(resSet.Name[resSet.Name.Length - 1])) { _resName = Regex.Replace(resSet.Name, ">|>|>", String.Empty); } } // 名前欄が数字ならリンクを貼る if (namePopup && HtmlTextUtility.IsDigit(_resName)) // 最後の文字が数字のときのみ処理する { sb.Append("<a href=\""); sb.Append(baseUri); sb.Append(HtmlTextUtility.ZenToHan(_resName)); sb.Append("\" target=\"_blank\">"); sb.Append(name); sb.Append("</a>"); name = sb.ToString(); mailname = name; sb.Remove(0, sb.Length); } #endregion #region Email付き名前の作成 else if (resSet.Email != String.Empty) { sb.Append("<a href=\"mailto:"); sb.Append(resSet.Email); sb.Append("\">"); sb.Append(name); sb.Append("</a>"); mailname = sb.ToString(); sb.Remove(0, sb.Length); } else { mailname = name; } #endregion #region 日付とIDを作成 dateString = resSet.DateString; dateonly = resSet.DateString; Match m = Regex.Match(resSet.DateString, @"\d{2,4}/\d{2}/\d{2}(\(\w\))?\s\d{2}:\d{2}(:\d{2}.\d{2}|:\d{2})?(\s[0-9a-zA-GJ-Z])?"); if (m.Success) { dateonly = m.Value; } #endregion #region Be2chIDのリンクを貼る // BE:0123456-# または <BE:0123456:0> 形式の二つあるみたい dateString = Regex.Replace(dateString, @"BE:(?<id>\d+)\-(?<rank>.+)", "<a href=\"http://be.2ch.net/test/p.php?i=${id}\" target=\"_blank\">?${rank}</a>", RegexOptions.IgnoreCase); dateString = // 面白ネタnews形式 Regex.Replace(dateString, @"<BE:(?<id>\d+):(?<rank>.+)>", "<a href=\"http://be.2ch.net/test/p.php?i=${id}\" target=\"_blank\">Lv.${rank}</a>", RegexOptions.IgnoreCase); #endregion #region 本分を作成 body = HtmlTextUtility.RemoveTag(resSet.Body, "a|font"); body = rexBRSpace.Replace(body, "<BR>"); body = HtmlTextUtility.Linking(body); #endregion #region レス参照を作成 body = HtmlTextUtility.RefRegex.Replace(body, "<a href=\"" + baseUri + "${num}\" target=\"_blank\" name=\"res" + resSet.Index + "_ref${num}\">${ref}</a>"); // body = HtmlTextUtility.ExRefRegex.Replace(body, "<a href=\"" + baseUri + "${num}\" target=\"_blank\">${num}</a>"); // 2011.12.16 水玉さん #endregion #region そのほかの置き換え処理 sb.Remove(0, sb.Length); sb.Append(skinhtml); sb.Replace("<PLAINNUMBER/>", resSet.Index.ToString()); sb.Replace("<MAILNAME/>", mailname); sb.Replace("<NUMBER/>", number); sb.Replace("<ID/>", resSet.ID); sb.Replace("<BE/>", resSet.BeLink); sb.Replace("<NAME/>", name); sb.Replace("<MAIL/>", resSet.Email); sb.Replace("<DATE/>", dateString); sb.Replace("<DATEONLY/>", dateonly); sb.Replace("<MESSAGE/>", body); sb.Replace("<SKINPATH/>", skinPath); sb.Replace("<HOST/>", resSet.Host); #endregion return(sb); }