4 Stimmen

Abrufen einer Teilzeichenkette von Text, der HTML-Tags enthält

Abrufen einer Teilzeichenkette von Text, der HTML-Tags enthält

Nehmen wir an, dass Sie die ersten 10 Zeichen des folgenden Textes benötigen:

"<p>Das ist Absatz 1</p>

dies ist Absatz 2</p>>"

Die Ausgabe würde lauten:

"<p>Das ist"

Der zurückgegebene Text enthält ein nicht geschlossenes P-Tag. Wird dieser Text auf einer Seite gerendert, wird der nachfolgende Inhalt durch das offene P-Tag beeinflusst. Idealerweise würde die bevorzugte Ausgabe alle nicht geschlossenen HTML-Tags in umgekehrter Reihenfolge schließen, in der sie geöffnet wurden:

"<p>Das ist</p>" Ich möchte eine Funktion, die einen Teilstring von HTML zurückgibt und dabei sicherstellt, dass keine Tags ungeschlossen bleiben

0 Stimmen

Ja, aber das ist nicht unser Problem. Ich möchte die Zeichenkette wie str1="<p>das ist</p>"

0 Stimmen

Was ist die Quelle dieser speziellen Zeichenfolge? Ist es etwas aus einem HTML-Element?

0 Stimmen

Wir wollen das in ein HTML-Element einfügen

3voto

Rahul Punkte 12103

Sie müssen Ihrem Code beibringen, wie er erkennt, dass Ihre Zeichenkette eigentlich HTML oder XML ist. Wenn Sie sie einfach wie eine Zeichenkette behandeln, können Sie nicht so damit arbeiten, wie Sie es möchten. Das bedeutet, dass Sie sie zunächst in das richtige Format umwandeln und dann mit diesem Format arbeiten müssen.

Ein XSL-Stylesheet verwenden

Wenn Ihr HTML wohlgeformtes XML ist, laden Sie es in eine XMLDocument und lassen Sie es durch ein XSL-Stylesheet laufen, das etwa wie folgt funktioniert:

<xsl:template match="p">
  <xsl:value-of select="substring(text(), 0, 10)" />
</xsl:template>

Einen HTML-Parser verwenden

Wenn es sich nicht um wohlgeformtes XML handelt (wie in Ihrem Beispiel, wo Sie eine plötzliche </p> in der Mitte), müssen Sie die einen HTML-Parser irgendeiner Art , wie zum Beispiel HTML-Beweglichkeitspaket (siehe diese Frage zu C#-HTML-Parsern ).

Verwenden Sie keine regulären Ausdrücke, da HTML ist zu komplex, um es mit Regex zu analysieren .

2voto

Chuhukon Punkte 21

Sie können die nächste statische Funktion verwenden. Ein funktionierendes Beispiel finden Sie hier: http://www.koodr.com/item/438c2e9c-62a8-45fc-9ca2-db1479f412e1 . Sie können dies auch in eine Erweiterungsmethode umwandeln.

public static string HtmlSubstring (string html, int maxlength) {
//initialize regular expressions
string htmltag = "</?\\w+((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)/?>";
string emptytags = "<(\\w+)((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)/?></\\1>";

//match all html start and end tags, otherwise get each character one by one..
var expression = new Regex(string.Format("({0})|(.?)", htmltag)); 
MatchCollection matches = expression.Matches(html);

int i = 0;
StringBuilder content = new StringBuilder();
foreach (Match match in matches)
{
    if (match.Value.Length == 1
        && i < maxlength) 
    {                    
        content.Append(match.Value);
        i++; 
    }
    //the match contains a tag
    else if (match.Value.Length > 1) 
        content.Append(match.Value);
}

return Regex.Replace(content.ToString(), emptytags, string.Empty); }

1voto

Cerebrus Punkte 25410

Ihre Anforderungen sind sehr unklar, so dass das meiste davon reine Spekulation ist. Außerdem haben Sie keinen Code zur Verfügung gestellt, der helfen würde, zu klären, was Sie tun möchten.

Eine Lösung könnte sein:

a. Finden Sie den Text zwischen den <p> y el </p> Tags. Sie können dazu die folgende Regex verwenden oder eine einfache Stringsuche durchführen:

\<p\>(.*?)\</p\>

b. Wenden Sie im gefundenen Text eine Substring() um den gewünschten Text zu extrahieren.

c. Setzen Sie den extrahierten Text wieder zwischen die <p> y el </p> Tags.

0 Stimmen

Aber ich denke, er hat den P-Tag nur als Beispiel genannt. Er könnte Teilstring von jeder Art von Tag herausziehen müssen.

0 Stimmen

@phoenix: Ihre Intuition ist sehr wahrscheinlich richtig.

0voto

Fenton Punkte 221749

Sie könnten eine Schleife über die HTML-Zeichenfolge ziehen, um die spitzen Klammern zu erkennen und ein Array von Tags zu erstellen und festzustellen, ob es für jedes Tag einen passenden schließenden Tag gibt. Das Problem ist, dass HTML auch nicht-schließende Tags zulässt, wie z. B. img, br, meta - man müsste also auch diese kennen. Man bräuchte auch Regeln, um die Reihenfolge des Schließens zu überprüfen, denn wenn man nur ein offenes mit einem geschlossenen Tag vergleicht, ist das kein gültiges HTML - wenn man ein div öffnet, dann ein p und dann das div schließt und dann das p schließt, ist das nicht gültig.

0voto

imxylz Punkte 7725

Versuchen Sie diesen Code (Python 3.x):

notags=('img','br','hr')
def substring2(html,size):
    if len(html) <= size:
        return html
    result,tag,count='','',0
    tags=[]
    for c in html:
        result += c
        if c == '<':
            intag=True
        elif c=='>':
            intag=False
            tag=tag.split()[0]
            if tag[0] == '/':
                tag = tag.replace('/','')
                if tag not in notags:
                    tags.pop()
            else:
                if tag[-1] != '/' and tag not in notags:
                    tags.append(tag)
            tag=''
        else:
            if intag: 
                tag += c
            else:
                count+=1
                if count>=size: break
    while len(tags)>0:
        result += '</{0}>'.format(tags.pop())
    return result

s='<div class="main">html <code>substring</code> function written by <span>imxylz</span>, using <a href="http://www.python.org">python</a> language</div>'
print(s)
for size in (30,40,55):
    print(substring2(s,size))

Ausgabe

<div class="main">html <code>substring</code> function written by <span>imxylz</span>, using <a href="http://www.python.org">python</a> language</div>
<div class="main">html <code>substring</code> function writte</div>
<div class="main">html <code>substring</code> function written by <span>imxyl</span></div>
<div class="main">html <code>substring</code> function written by <span>imxylz</span>, using <a href="http://www.python.org">python</a></div>

mehr

Siehe Code unter github .

Eine weitere question .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X