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
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
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....
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...