Regulärer Ausdruck für HTML-Tag

sina.die

Mitglied
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>
 
Willst Du an den Inhalt zwischen den Tags?
Java:
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));
}
 
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:
Java:
Pattern pattern = Pattern.compile("<p.*?>(.*?)<");
 
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
Java:
text= text.replaceAll("<p.*?>(.*?)</p>","");
nicht löschen kann. :-(
 
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.
 
Zuletzt bearbeitet:
Also von dem:
HTML:
<p style="font-size:12.0pt;margin-bottom:.0001pt;margin-left:0cm;font-family:Times New Roman;margin-right:0cm;"> </p>
soll
Code:
160;
übrig bleiben?
 
Nee, von dem
HTML:
<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:
<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></html>
übrigbleiben.

Und von
HTML:
<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:
<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.
 
Zuletzt bearbeitet:
Wenn das &# auch noch relevant ist, muss man das natürlich auch noch ins Suchmuster mit aufnehmen. Bsp:
Java:
String htmlText = "<html>" +
	"<p style=\"bla\">&#undirgendwas</p>" +
	"<p style=\"bla\">Hallohallo160oder irgendwas anderes</p>" +
	"</html>";
System.out.println(htmlText.replaceAll("<p.*?>\\s*&#(.*?)</p>", ""));
 
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?
 

Anhänge

  • grrrrr.jpg
    grrrrr.jpg
    49,9 KB · Aufrufe: 49
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:
<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>
 
Mir fällt gerade ein, dass es so nicht gehen wird, denn der RegEx wird imho andere <p>'s miteinschließen, sprich:
Code:
<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 😉 )
 
Mir fällt gerade ein, dass es so nicht gehen wird, denn der RegEx wird imho andere <p>'s miteinschließen, sprich:
Code:
<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 😉 )
Ausprobieren ;-)
Die "Gier" der Quantoren kann man durch ein ? unterdrücken, deswegen z.B. auch das .*?
 

Zurück
Oben