2009-06-02 7 views
1

Versuchen Sie, dies für eine Weile jetzt zu lösen.Verwenden Sie regulären Ausdruck, um HTML zu trimmen

Ich brauche einen regulären Ausdruck die Zeilenumbrüche, Tabulatoren und Zwischenräume zwischen den HTML-Tags in dem Beispiel unten gezeigt, abzustreifen:

Quelle:

<html> 
    <head> 
    <title> 
      Some title 
     </title> 
    </head> 
</html> 

gewünschte Ergebnis:

<html><head><title>Some title</title></head></html> 

The Trimmen der Leerzeichen vor dem "Some-Titel" ist optional. ich für jede Hilfe dankbar sein würde

+1

Woher wissen Sie, welchen Leerraum zu entfernen ist? Warum entfernen Sie den Leerraum * um * "Irgendeinen Titel", aber nicht * in * it? Was sind deine Regeln hier? –

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

Antwort

0

s/\s*(<[^>]+>)\s*/\1/gs

oder, in C#:

Regex.Replace(html, "\s*(<[^>]+>)\s*", "$1", RegexOptions.SingleLine);

+0

das erste Zeichen kann kein Leerzeichen sein, oder eine gültige HTML-Zeichenfolge wie "Wenn ein < 3 and b > 4" mit Ihrem Ausdruck –

+0

gelöscht werden würde und Sie keine endenden Tags entweder übereinstimmen. –

+0

Ok mein Schlechter. Ich habe das nicht richtig gelesen. –

0

s/>\s+</></gs

20

Wenn die HTML streng ist, laden Sie es mit einem XML-Leser und schreiben Sie es zurück, ohne Formatierung. Dadurch bleiben die Leerzeichen in Tags erhalten, nicht jedoch zwischen ihnen.

+4

Nicht zu erwähnen, es erfindet das Rad nicht neu. – Pesto

+0

Keine schlechte Idee ... –

+0

, die von dem Schema abhängen könnte. Die Bewahrung von Leerzeichen in Tags ist ein spezifisches Attribut in Schemadefinitionen. – Jherico

0

Dies entfernt die Leerzeichen zwischen den Tags und den Raum zwischen den Tags und dem Text.

s/(\s*(<))|((>)\s*)/\2\4/g 
1

\ d stimmt nicht nur [0-9] in Perl 5.8 und 5.10 überein; Es entspricht einem UNICODE-Zeichen, das das Attribut digit (einschließlich "\ x {1815}" und "\ x {FF15}") enthält. Wenn Sie [0-9] meinen, müssen Sie entweder [0-9] verwenden oder das Pragma bytes verwenden (aber es verwandelt alle Zeichenfolgen in 1-Byte-Zeichen und ist normalerweise nicht das, was Sie wollen).

Regexes sind grundsätzlich schlecht beim Parsen von HTML (siehe Can you provide some examples of why it is hard to parse XML and HTML with a regex? für warum). Was Sie brauchen, ist ein HTML-Parser. Beispiele finden Sie unter Can you provide an example of parsing HTML with your favorite parser? mit einer Vielzahl von Parsern.

Sie können die HTMLAgilityPack answer hilfreich finden.

-1

Ich wollte die neuen Zeilen beibehalten, da das Entfernen von Zeilenumbrüchen mein HTML durcheinander brachte. Also ging ich mit dem folgenden. .

private static string ProcessHTMLFile(string input) 
{ 
    string opt = Regex.Replace(input, @"()*", "", RegexOptions.Singleline); 
    opt = Regex.Replace(opt, @"[\t]*", "", RegexOptions.Singleline); 
    return opt; 
} 
0
Regex.Replace(input, "<[^>]*>", String.Empty); 
0

Eine Lösung mit XSLT würde wie folgt aussehen:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">  
<xsl:output method="xml" encoding="UTF-8" indent="no"/> 

<xsl:template match="*|@*"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<!-- trim whitespaces from the content --> 
<xsl:template match="text()"> 
    <!-- remove from tag to content --> 
    <xsl:variable name="trimmedHead" select="replace(.,'^\s+','')"/> 
    <xsl:variable name="trimmed" select="replace($trimmedHead,'\s+$','')"/> 
    <xsl:value-of select="$trimmed"/> 
</xsl:template> 

<!-- do not trim where text content exist --> 
<xsl:template match="text()"> 
    <xsl:if test="not(matches(.,'^\s+$'))"> 
     <xsl:value-of select="."/> 
    </xsl:if> 
</xsl:template> 

Sie können die Vorlage wählen Sie verwenden möchten. Die erste löscht alle Leerzeichen, auch wenn Inhalt vorhanden ist, und die zweite löscht nur, wenn es nur Leerzeichen oder Zeilenumbrüche gibt.

Verwandte Themen