문제

내가 작업하고있는 .NET 웹 시스템을 통해 최종 사용자는 일부 상황에서 HTML 형식의 텍스트를 입력 할 수 있습니다. 그 장소 중 일부에서는 모든 태그를 남기고 싶지만 후행 브레이크 태그를 벗겨냅니다 (그러나 텍스트 본문 안에 브레이크를 남겨 두십시오.)

이것을하는 가장 좋은 방법은 무엇입니까? (나는 이것을하는 방법을 생각할 수 있지만, 그들이 최고는 아니라고 확신합니다.)

도움이 되었습니까?

해결책

처럼 @미치 말했다,

//  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);

다른 팁

작은 변화 Bdukes 코드는 역 추적하지 않기 때문에 더 빠릅니다.

public static Regex regex = new Regex(
    @"(?:\<br[^>]*\>)*$",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
);
regex.Replace(text, string.Empty);

나는 이것이 가장 좋은 방법이 아니라고 확신하지만, 당신이 후행 공간이나 무언가가 없다면 효과가 있어야합니다.

while (myHtmlString.EndsWith("<br>"))
{
    myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}

나는 당신의 원래 질문에서 모호성을 무시하고 문자 그대로 읽으려고 노력하고 있습니다. 다음은 String을 사용하기 위해 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를 사용하여 String의 끝에 고정하기 위해 Regex 매치를 설정하여 텍스트를 찾아 제거 할 수 있습니다.

또한 (마크 업이 유효한 나무 일 가능성이있는 경우) :

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();

위의 코드는 약간 "스크래치 패드"이지만 콘솔 응용 프로그램에 자르고 붙여 넣고 실행하면 작동합니다.

regex를 사용하거나 후행 문자열이 휴식인지 확인하고 제거 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top