# Regulärer Ausdruck für HTML-Tag



## sina.die (27. Jul 2010)

Ich krieg's einfach nicht hin... Kann mir jemand weiterhelfen mit nem regulären Ausdruck für einen bestimmten HTML-Paragraphen?

<p
*&#*
</p>

So in etwa stell ich mir das vor. Das Sternchen soll halt heißen: beliebig viele Zeichen oder keins.

Beispiel-Incoming-String ist dieser hier (sind auch \n dazwischen möglich, die könnte ich aber rausfiltern, wenn sie stören)
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">
       
</p>


----------



## Michael... (27. Jul 2010)

Willst Du an den Inhalt zwischen den Tags?

```
String text = "abcd<p style=\"blablublub\">123</p>efgh<p style=\"bla\">456</p>ijkl";
Pattern pattern = Pattern.compile("<p.*?>(.*?)</p>");
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
	System.out.println(matcher.group(1));
}
```


----------



## musiKk (27. Jul 2010)

Nimm lieber einen HTML-Parser. Zumal das p-Element kein schließendes Tag haben muss.


----------



## Michael... (27. Jul 2010)

Wenn man weiss, was da auf einen zu kommt und man nur an einzelne Inhalte will, muss man ja nicht unbedingt einen Parser einbinden.
Falls es mit dem schliessenden Tag Probleme geben sollte könnte man das Pattern ja auch so schreiben:

```
Pattern pattern = Pattern.compile("<p.*?>(.*?)<");
```


----------



## sina.die (27. Jul 2010)

Also, ich brauche am besten den ganzen Tag, nicht nur die Inhalte.
Die Variante mit dem schließenden Tag würde eigentlich reichen, aber ich hätte sonst auch die Möglichkeit den anderen zur Sicherheit zusätzlich abzufragen. Wichtig ist halt, das in dem Inhalt &# vorkommt. Und den will ich dann eigentlich nur löschen (hätte es daher einfach mit replaceAll gemacht).
Und irgendwie will das bei mir nicht gehen. Mir leuchtet auch überhaupt nicht ein, warum ich den Tag mit 

```
text= text.replaceAll("<p.*?>(.*?)</p>","");
```
 nicht löschen kann. :-(


----------



## Michael... (27. Jul 2010)

Was soll den am Ende genau rauskommen?
Mit dem replaceAll löscht Du ja alles von <p> bis </p>, die Tags inklusive.


----------



## sina.die (28. Jul 2010)

Naja, der Rest von dem was noch so zwischen den <html>-Tags steht. 
Nur der eine <p>-Tag mit Inhalt *&#* soll raus.

Edit: Ach ja... mein Incoming-String-war halt zu Testzwecken. Da hätte dann ruhig ein Leerstring rauskommen dürfen. Normalerweise steht aber schon was drumherum.


----------



## Michael... (28. Jul 2010)

Also von dem:

```
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;"> </p>
```
soll 
	
	
	
	





```
160;
```
 übrig bleiben?


----------



## sina.die (28. Jul 2010)

Nee, von dem

```
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;"> </p>
```
soll garnichts übrig bleiben.

Von beispielsweise

```
<html><p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;"> </p></html>
```
soll 

```
<html></html>
```
übrigbleiben.

Und von

```
<html>
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;"> </p>
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">Hallohallo160oder irgendwas anderes</p>
</html>
```
soll

```
<html>
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">Hallohallo160oder irgendwas anderes</p>
</html>
```
übrigbleiben.


----------



## Michael... (28. Jul 2010)

Wenn das *&#* auch noch relevant ist, muss man das natürlich auch noch ins Suchmuster mit aufnehmen. Bsp:

```
String htmlText = "<html>" +
	"<p style=\"bla\">&#undirgendwas</p>" +
	"<p style=\"bla\">Hallohallo160oder irgendwas anderes</p>" +
	"</html>";
System.out.println(htmlText.replaceAll("<p.*?>\\s*&#(.*?)</p>", ""));
```


----------



## sina.die (29. Jul 2010)

Danke, nun klappt's ;-)


----------



## sina.die (29. Jul 2010)

Ach, verdammt.
Nee, das geht doch nicht immer. Können Zeilenumbrüche vielleicht ein Problem sein? Hier mal ein "Inspect von meinem Beispielstring".
Oder sind vielleich die Anführungszeichen in dem String ein Problem?

Sollte ich mich evtl doch lieber mal mit HTMLParsern beschäftigen?


----------



## XHelp (29. Jul 2010)

Wenn ich es richtig in Erinnerung habe beinhaltet der Punkt-Operator in RegEx kein Zeilenumbruch


----------



## sina.die (29. Jul 2010)

Hmm, nur mit replaceAll("\n","") gehen die irgendwie auch nicht raus.
Hier nochmal der String. AUf dem Bild erkennt man ja kaum was, sehe ich gerade.

```
<html>
  <head>
    
  </head>

  <body>
    <table cellpadding="0" cellspacing="0" style="border:none;" border="1">
      <tr>
                <td valign="top" style="border:solid windowtext 1.0pt;padding-right:5.4pt;padding-bottom:0cm;padding-left:5.4pt;padding-top:0cm;width:204.66667;" width="205">
          <p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">
             
          </p>

        </td>

                <td valign="top" style="border:solid windowtext 1.0pt;padding-right:5.4pt;border-left:none;padding-bottom:0cm;padding-left:5.4pt;padding-top:0cm;width:204.73334;" width="205">
          <p style="margin-bottom:.0001pt;font-size:12.0pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">
             
          </p>

        </td>

                <td valign="top" style="border:solid windowtext 1.0pt;padding-right:5.4pt;border-left:none;padding-bottom:0cm;padding-left:5.4pt;padding-top:0cm;width:204.73334;" width="205">
          <p style="margin-bottom:.0001pt;font-size:12.0pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">
             
          </p>

        </td>

            </tr>

        </table>

    <p style="margin-bottom:.0001pt;font-size:12.0pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;">
       
    </p>

  </body>

</html>
```


----------



## Michael... (29. Jul 2010)

XHelp hat gesagt.:


> Wenn ich es richtig in Erinnerung habe beinhaltet der Punkt-Operator in RegEx kein Zeilenumbruch


Korrekt. Der Zeilenumbruch zwischen Wert und </p> passt nicht auf das Muster. Folgendes sollte funktionieren:

```
htmlText.replaceAll("<p.*?>\\s*&#(.|\\s)*?</p>", "");
```


----------



## XHelp (29. Jul 2010)

Mir fällt gerade ein, dass es so nicht gehen wird, denn der RegEx wird imho andere <p>'s miteinschließen, sprich:

```
<p>&#123</p>HIERIRGENDEINTEXT<p>&#456</p>
```
Der RegEx wird von ersten <p> bis zum letzen </p> löschen. Also auch HIERIRGENDEINTEXT...... soweit meine Überlegungen stimmen
(ja ich weiß, dass ein regulärer Ausdruck nichts löscht  )


----------



## Michael... (29. Jul 2010)

XHelp hat gesagt.:


> Mir fällt gerade ein, dass es so nicht gehen wird, denn der RegEx wird imho andere <p>'s miteinschließen, sprich:
> 
> ```
> <p>&#123</p>HIERIRGENDEINTEXT<p>&#456</p>
> ...


Ausprobieren ;-)
Die "Gier" der Quantoren kann man durch ein *?* unterdrücken, deswegen z.B. auch das *.*?*


----------



## XHelp (29. Jul 2010)

Michael... hat gesagt.:


> Ausprobieren


Mist... erst denken, dann schreiben


----------



## sina.die (29. Jul 2010)

Scheint zu klappen. :-D
Nochmal vielen Dank!


----------

