Реализация обработки сокетов будет хорошей, если вы хотите, чтобы два сервера взаимодействовали друг с другом. http://php.net/manual/en/sockets.examples.php
Поскольку @Mitch сказал,
// using System.Text.RegularExpressions;
/// <summary>
/// Regular expression built for C# on: Thu, Sep 25, 2008, 02:01:36 PM
/// Using Expresso Version: 2.1.2150, http://www.ultrapico.com
///
/// A description of the regular expression:
///
/// Match expression but don't capture it. [\<br\s*/?\>], any number of repetitions
/// \<br\s*/?\>
/// <
/// br
/// Whitespace, any number of repetitions
/// /, zero or one repetitions
/// >
/// End of line or string
///
///
/// </summary>
public static Regex regex = new Regex(
@"(?:\<br\s*/?\>)*$",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
Я уверен, что это не лучший способ или, но он должен работать, если у Вас нет конечных пробелов или чего-то.
while (myHtmlString.EndsWith("<br>"))
{
myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}
Небольшое изменение кода bdukes, который должен быть быстрее, поскольку это не отслеживает в обратном порядке.
public static Regex regex = new Regex(
@"(?:\<br[^>]*\>)*$",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
Вы могли также попробовать (если разметка, вероятно, будет допустимым деревом), что-то подобное:
string s = "<markup><div>Text</div><br /><br /></markup>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(s);
Console.WriteLine(doc.InnerXml);
XmlElement markup = doc["markup"];
int childCount = markup.ChildNodes.Count;
for (int i = childCount -1; i >= 0; i--)
{
if (markup.ChildNodes[i].Name.ToLower() == "br")
{
markup.RemoveChild(markup.ChildNodes[i]);
}
else
{
break;
}
}
Console.WriteLine("---");
Console.WriteLine(markup.InnerXml);
Console.ReadKey();
Код выше является немного "временной памятью", но если Вы вырезаете и вставляете его в Консольное приложение и выполняете его, это действительно работает:=)
Я пытаюсь проигнорировать неоднозначность в Вашем исходном вопросе и считать его буквально. Вот дополнительный метод что перегрузки TrimEnd для взятия строки.
static class StringExtensions
{
public static string TrimEnd(this string s, string remove)
{
if (s.EndsWith(remove))
{
return s.Substring(0, s.Length - remove.Length);
}
return s;
}
}
Вот некоторые тесты, чтобы показать, что это работает:
Debug.Assert("abc".TrimEnd("<br>") == "abc");
Debug.Assert("abc<br>".TrimEnd("<br>") == "abc");
Debug.Assert("<br>abc".TrimEnd("<br>") == "<br>abc");
Я хочу указать, что это решение легче считать, чем regex, вероятно, быстрее, чем regex (необходимо использовать профилировщика, не предположение, если Вы обеспокоены производительностью), и полезный для удаления других вещей от концов строк.
regex становится более соответствующим, если Ваша проблема является более общей, чем Вы заявили (например, если Вы хотите удалить <BR>
и </BR>
и соглашение с конечными пробелами или что бы то ни было.
Можно использовать regex, чтобы найти и удалить текст с набором соответствия regex к привязке в конце строки.
можно использовать RegEx или проверить, является ли запаздывающая строка повреждением, и удалите его