2016-04-29 6 views
4

I String mit HTML-Bilder, zum Beispiel haben:C# HTML-String -> get Länge ohne html

string str = "There is some nice <img alt='img1' src='img/img1.png' /> images in this <img alt='img2' src='img/img2.png' /> string. I would like to ask you <img alt='img3' src='img/img3.png' /> how Can I can I get the Lenght of the string?"; 

Ich möchte die Länge der Zeichenfolge erhalten, ohne die Bilder und die Anzahl der Bilder. So sollte das Ergebnis sein:

int strLenght = 111; 
int imagesCount= 3; 

Können Sie mir bitte den effektivsten Weg zeigen?

Dank

+0

Sie können dies von RegulaererAusdruck mit Hilfe tun. Bitte lassen Sie mich wissen, wenn Sie eine Lösung basierend darauf benötigen –

+0

Werfen Sie einen Blick auf diese Antwort, um HTML-Tags zu entfernen: http://StackOverflow.com/a/18154046/5119765 Dann können Sie die String-Länge erhalten. –

+1

Ihre beste Option wäre die Verwendung eines HTML-Parsers wie [HTML Agility Pack] (https://htmlagilypack.codeplex.com/), damit Sie die Länge des Inhalts und die Anzahl der Bild-Tags richtig zählen können. – juharr

Antwort

1

Wenn Sie es mit Hilfe von RegulaererAusdruck tun würden, wie ich oben in meinem Kommentar erwähnt. Bitte folgenden Code verwenden

var regex = new System.Text.RegularExpressions.Regex("<img[^>]*/>"); 
var plainString = regex.Replace(str, ""); 

// plainString.length will be string length without images 
    var cnt = regex.Matches(str).Count; // cnt will be number of images 
2

Ich hatte ein ähnliches Problem und ich habe diese Methode erstellt. Sie können es verwenden, um HTML-Tags abzustreifen und Ihre Zeichenfolge

public static string StripHtmlTags(string source) 
{ 
    if (string.IsNullOrEmpty(source)) 
    { 
    return string.Empty; 
    } 

    var array = new char[source.Length]; 
    int arrayIndex = 0; 
    bool inside = false; 
    for (int i = 0; i < source.Length; i++) 
    { 
    char let = source[i]; 
    if (let == '<') 
    { 
     inside = true; 
     continue; 
    } 

    if (let == '>') 
    { 
     inside = false; 
     continue; 
    } 

    if (!inside) 
    { 
     array[arrayIndex] = let; 
     arrayIndex++; 
    } 
    } 

    return new string(array, 0, arrayIndex); 
} 

Ihre Zählung wie wäre zählen:

int strLength = StripHtmlTags(str).Count; 
+0

Sie wissen, dass Sie einfach 'foreach (char let in source)' anstelle von 'string' implementieren können' IEnumerable '. – juharr

+0

ja, es könnte definitiv optimiert werden Danke –

3

ich einen echten HTML-Parser verwenden würde vorschlagen, zum Beispiel HtmlAgilityPack. Dann ist es einfach:

string html = "There is some nice <img alt='img1' src='img/img1.png' /> images in this <img alt='img2' src='img/img2.png' /> string. I would like to ask you <img alt='img3' src='img/img3.png' /> how Can I can I get the Lenght of the string?"; 

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(html); 
int length = doc.DocumentNode.InnerText.Length;    // 114 
int imageCount = doc.DocumentNode.Descendants("img").Count(); // 3 

Dies ist, was DocumentNode.InnerText kehrt in Ihrer Probe, haben Sie einige Räume übersprungen:

There is some nice images in this string. I would like to ask you how Can I can I get the Lenght of the string? 
2

hinzufügen (COM) Verweis auf MSHTML (Microsoft HTML-Objekt lib) und Sie kann:

var doc = (IHTMLDocument2)new HTMLDocument(); 
doc.write(str); 

Console.WriteLine("Length: {0}", doc.body.innerText.Length); 
Console.WriteLine("Images: {0}", doc.images.length); 
0

mochte ich John Smith Lösung, aber ich hatte Trim() am Ende hinzuzufügen, um das MS Word Ergebnis übereinstimmen.

verwenden:

return new string(array, 0, arrayIndex).Trim();