Laden...

String kürzen ohne HTML Tags offen zu lassen?

Erstellt von b0b0nr1 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.960 Views
B
b0b0nr1 Themenstarter:in
92 Beiträge seit 2011
vor 12 Jahren
String kürzen ohne HTML Tags offen zu lassen?

Hi!

Auf meiner Seite habe ich nun alles für den ersten Betrieb fertig. Nur eins stört mich.

Dei Admins können zum designen der Newsbeiträge HTML verwenden, was sich Spinne-Feind ist mit der Funktion, die ab 200 wörtern für die "Übersicht" Seite und die "Account-Startseite" abschneidet und ein (...) ran hängt.

Gibt es einen Weg genau das zu machen und ggf offene HTML Tags im string zu schließen?

Meine jetzige Idee klappt nicht so gut 😉 war auch nur eine Notlösung vorerst.


  string[] words = s.Split(' ');
                int countwords = 0;
                string lastonetext = "";
                foreach (string word in words)
                {

                    if(countwords<200 && !word.ToLower().Contains("<div") && !word.ToLower().Contains("</div") && !word.ToLower().Contains("<table")&&!word.ToLower().Contains("<tr")&&!word.ToLower().Contains("<td")&&!word.ToLower().Contains("</td") && !word.ToLower().Contains("</tr")&&!word.ToLower().Contains("</table")) lastonetext += " "+ word;
                    if (countwords == 201) lastonetext += "(...)";
                    countwords++;
                }


Grüße,

b0b0

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

die ab 200 wörtern für die "Übersicht" Seite und die "Account-Startseite" abschneidet

das ist nicht so ganz einfach... das String.Split(" ") kannst Du jedenfalls vergessen, die HTML-Tags können ja auch noch Attribute habe, die auch durch Leerzeichen abgetrennt sind. So kommst Du also nicht weiter. Du musst die ganzen Tags überspringen, also alles was zwischen '<' und '>' steht. Dabei müsstest Du Dir eine Liste mit allen gerade offenen Tags merken, damit Du diese nachher sauber schliessen kannst.

Vielleicht wäre es eine Alternative, das Ganze als XML zu parsen...

Allerdings sehe ich da noch einige grundsätzliche Probleme: Das beabsichtigte Design wird vermutlich nicht mehr erreicht, und wenn da auch Tabellen erlaubt sind, und Du irgendwo mitten in einer Zeile abschneidest, musst Du z.B. noch die fehlenden Zellen auffüllen. Es gibt sicher noch mehr Fallstricke, bei denen Du dich nach der Dokumentstruktur richten musst und nicht einfach abschneiden kannst, selbst wenn fehlende End-Tags noch ergänzt werden.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

B
b0b0nr1 Themenstarter:in
92 Beiträge seit 2011
vor 12 Jahren

Ok....da setze ich mich wan anders ran.... bevor der string gesplittet wird wird er immo bei mir durch folgendes gejagt:



    private string boxespreview(string input) {

        string[] SS = input.Split(' ');
        string S = "";
        for (int x = 0; x < SS.Length; x++) {
            S += " " + SS[x].Replace("<br", "[//BR//]<br");
        
        
        }
        S = StripHTML(S);

        return S.Replace("[//BR//]","<br/>");
    }
    /// <summary>
    /// Removes the HTML Code.
    /// </summary>
    /// <param name="Text">The text.</param>
    /// <returns>The string without HTML Code</returns>
    private string StripHTML(string inputString)
    {
        return Regex.Replace(inputString, "<.*?>", string.Empty);
    }

sprich...ich übernehme nur die BRs...erstmal lass ich die seite anlaufen im juni;) und dann setz ich mich weiter daran dass die mit design da stehen...

was du mir geschrieben hast, macht mir jedenfalls sehr viel kopf zerbrechen, wie ich das lösen werden^^

danke aber für die schnelle antowort....

M
402 Beiträge seit 2005
vor 12 Jahren

Hi...

damit du den Text gefahrlos abschneiden kannst, müsstest du alle HTML-Tags rausstripen und "erlaubte" Tags übriglassen...

Ich hab dafür eine nette Extension-Methode:

        public static string StripTags(this string Input, string[] AllowedTags)
        {
            Regex StripHTMLExp = new Regex(@"(<\/?[^>]+>)");
            string Output = Input;

            foreach (Match Tag in StripHTMLExp.Matches(Input))
            {
                string HTMLTag = Tag.Value.ToLower();
                bool IsAllowed = false;

                foreach (string AllowedTag in AllowedTags)
                {
                    int offset = -1;

                    // Determine if it is an allowed tag
                    // "<tag>" , "<tag " and "</tag"
                    if (offset != 0) offset = HTMLTag.IndexOf('<' + AllowedTag + '>');
                    if (offset != 0) offset = HTMLTag.IndexOf('<' + AllowedTag + ' ');
                    if (offset != 0) offset = HTMLTag.IndexOf("</" + AllowedTag);

                    // If it matched any of the above the tag is allowed
                    if (offset == 0)
                    {
                        IsAllowed = true;
                        break;
                    }
                }

                // Remove tags that are not allowed
                if (!IsAllowed) Output = ReplaceFirst(Output, Tag.Value, "");
            }

            return Output;
        }

        private static string ReplaceFirst(string haystack, string needle, string replacement)
        {
            int pos = haystack.IndexOf(needle);
            if (pos < 0) return haystack;
            return haystack.Substring(0, pos) + replacement + haystack.Substring(pos + needle.Length);
        }
      
    }

Vielleicht kannst du das für deine Zwecke verwenden bzw. adaptieren...