Reguläre Ausdrücke und BBCode

florian1x

Aktives Mitglied
Hallo,

ich habe ein Projekt in dem ich BBCODE per jsp realisieren wollte.
Hierzu wollte ich mir eine Java Klasse schreiben, die einfach nur eine Methode parseBB(String input) enthält.
ist auch soweit kein problem.
Aber wie mache ich das?

mit php geht das ja recht einfach

$text = preg_replace("/\[b\](.*)\[\/b\]/Usi", "<b>\\1</b>", $text);

wäre zum beispiel für fettgedruckt.

aber in java wüsste ich gerdae nicht genau wies geht

im Pattern gebe ich ja an nach was der suchen soll.
und im Matcher dann den zu durchsuchenden String.

aber wieg nau tausch ich dass dann alles aus und kann ich einfach den gleichen Regex wie bei PHP benutzen?
 
G

Gast2

Gast
Ich denke du kannst den Regex so übernehmen, würd ich einfach mal testen.

Wenn du nur ersetzen willst reicht es aus wenn du die Methode replaceAll aus der Klasse String aufrufst, die kann auch mit regexen umgehen.
 

florian1x

Aktives Mitglied
Das Problem ist nicht dass ersetzten. Sondern dass ja zwsichen den tags auch noch was steht.
Nagut für b is das jetzt net so schwer
anfangs tag suchen, end tag suchen und jeweisl einzeln austauschen
aber ich will das in einem regex machen und dafür müsst ich den inhalt dazwischen gruppieren, so dass ichs später wieder benutzen kann.

in php wurde dass halt hiermit (.*) gemacht und auf den inhalt kann man dann hinterher mit \\1 zugreifen.

aber wie mach ich das in java
und das mit dem einfachen übernehmen macht mich stutzig weil ich bei keinem beispiel aus java die delimitter gesehen habe wie in dem php beispiel das "/" der fall ist
 

Ark

Top Contributor
Schau dir mal [c]java.util.regex.Matcher.group(int)[/c] an. Unter Angabe der Nummer der öffnenden(?) Klammer im Regex kann man sich so zurückgeben lassen, was durch den geklammerten Ausdruck erkannt wurde.

Aber spätestens bei geschachtelten Zitat-Blöcken gerätst du mit regulären Grammatiken sowieso in Schwulitäten. ;)

Ark
 

florian1x

Aktives Mitglied
mhh stimmt, an verschachtellungen gleicher elemente habe ich ja bisher noch nicht gedacht.
dann schließt das innere closing tag ja das erste öffnentag

oder ich durchlauf den String mit na rekursiven methode, die sich jedesmal die tiefe der verschachtellung merkt.
 

florian1x

Aktives Mitglied
Also ich hab die Lösung und die will ich die Lösung mal nicht vorenthalten.

BBCodeParser Klasse:

Java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Florian
 */
public class BBCodeParser {
    public BBCodeParser(){}

    public static String parse(String input){
        StringBuffer sb = new StringBuffer();

        Pattern p = Pattern.compile("\\[b\\](.*)\\[\\/b\\]");
        Matcher m = p.matcher(input);
        while(m.find()) {
            m.appendReplacement(sb, "<b>"+m.group(1)+"</b>");
        }
        m.appendTail(sb);
        return sb.toString();
    }
}

test klasse
Java:
package eic;

public class Main {

    public static void main(String[] args) {
        BBCodeParser b = new BBCodeParser();
        String s = "Hallo [b] blubb [/b] dub didub";
        System.out.println(b.parse(s));
    }

}

erzeugt dann die ausgabe:

Hallo <b> blubb </b> dub didub
 

florian1x

Aktives Mitglied
ich merke gerade dass noc hein fehler drin ist

String s = "Hallo [b*] blubb [/b] dub [b*]didub[/b]"; (ohne die *)

erzeugt die ausgabe

Hallo <b> blubb [/b] dub didub</b>

gewollt ist aber

Hallo <b> blubb </b> dub <b>didub</b>
 
G

Gast2

Gast
ändere mal:
Java:
"\\[b\\](.*)\\[\\/b\\]"
zu
Java:
"\\[b\\](.*?)\\[\\/b\\]"
 

florian1x

Aktives Mitglied
Und hier nochmal zum Abschluss meine Klasse mit ein paar eingebauten BBCodes
falls neugieriege sich hierhin verirren

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package eic;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Florian
 */
public class BBCodeParser {
    public BBCodeParser(){}

    public static String parse(String input){


        // <b>...</b>
        StringBuffer sb = new StringBuffer();
        Pattern p = Pattern.compile("(?i)\\[b\\](.*?)\\[\\/b\\]");
        Matcher m = p.matcher(input);
        while(m.find()) {
            m.appendReplacement(sb, "<b>"+m.group(1)+"</b>");
            
        }
        m.appendTail(sb);

        // <i>...</i>
        String tmp = sb.toString();
        sb.delete(0, sb.length());
        p = Pattern.compile("(?i)\\[i\\](.*?)\\[\\/i\\]");
        m = p.matcher(tmp);
        while(m.find()) {
            m.appendReplacement(sb, "<i>"+m.group(1)+"</i>");
        }
        m.appendTail(sb);

        // <u>...</u>
        tmp = sb.toString();
        sb.delete(0, sb.length());
        p = Pattern.compile("(?i)\\[u\\](.*?)\\[\\/u\\]");
        m = p.matcher(tmp);
        while(m.find()) {
            m.appendReplacement(sb, "<u>"+m.group(1)+"</u>");
        }
        m.appendTail(sb);

        // <center>...</center>
        tmp = sb.toString();
        sb.delete(0, sb.length());
        p = Pattern.compile("(?i)\\[center\\](.*?)\\[\\/center\\]");
        m = p.matcher(tmp);
        while(m.find()) {
            m.appendReplacement(sb, "<u>"+m.group(1)+"</u>");
        }
        m.appendTail(sb);

        
        //[color="farbe"]text[/color]
        tmp = sb.toString();
        sb.delete(0, sb.length());
        p = Pattern.compile("(?i)\\[color=#(.*?)\\](.*?)\\[\\/color\\]");
        m = p.matcher(tmp);
        while(m.find()) {
            m.appendReplacement(sb, "<color=\"#"+m.group(1)+"\">"+m.group(2)+"</color>");
        }
        m.appendTail(sb);

        //[url="pfad"]text[/url]
        tmp = sb.toString();
        sb.delete(0, sb.length());
        p = Pattern.compile("(?i)\\[url=(.*?)\\](.*?)\\[\\/url\\]");
        m = p.matcher(tmp);
        while(m.find()) {
            m.appendReplacement(sb, "<a href=\""+m.group(1)+"\">"+m.group(2)+"</a>");
        }
        m.appendTail(sb);
        
        // [img]source[/img]
        tmp = sb.toString();
        sb.delete(0, sb.length());
        p = Pattern.compile("\\[img\\](.*?)\\[\\/img\\]");
        m = p.matcher(tmp);
        while(m.find()) {
            m.appendReplacement(sb, "<img src=\""+m.group(1)+"\" />");
        }
        m.appendTail(sb);
                

        tmp = sb.toString();
        return tmp;
    }
}

und die testklasse

Java:
package eic;

public class Main {

    public static void main(String[] args) {
        BBCodeParser b = new BBCodeParser();
        System.out.println(b.parse("Ich bin [b]dick[/b]."));
        System.out.println(b.parse("Ich bin [i]kurisv[/i]."));
        System.out.println(b.parse("Ich bin [u]unterstrichen[/u]."));
        System.out.println(b.parse("Ich bin [center]zentriert[/center]."));
        System.out.println(b.parse("Ich bin [color=#FF0000]rot[/color]."));
        System.out.println(b.parse("Ich bin [url=http://127.0.0.1]ein Link[/url]."));
        System.out.println(b.parse("Ich bin [img]http://einBild.jpg[/img]."));
        
    }
}

der ignoriert jetzt auch groß und klein Schreibung in den Tags lediglich verschachtellungen gehen net.

die ausgabe wäre dann

Ich bin <b>dick</b>.
Ich bin <i>Kurisv</i>.
Ich bin <u>unterstrichen</u>.
Ich bin <u>zentriert</u>.
Ich bin <color="#FF0000">rot</color>.
Ich bin <a href="http://127.0.0.1">ein Link</a>.
Ich bin <img src="http://einBild.jpg" />.
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
muss man für <color>,<a>... noch anpassen, aber so könntest du verschachteln:

Java:
String[] regex	= 
{
	"(?i)\\[(u)\\](.*?)\\[\\/u\\]",
	"(?i)\\[(b)\\](.*?)\\[\\/b\\]",
	"(?i)\\[(i)\\](.*?)\\[\\/i\\]"
};
		
String input	= "[b]Hallo mein [u]name[/u] ist [i]Tomate_Salat[/i][/b]";		

for(String reg : regex)
{
	input	= input.replaceAll(reg, "<$1>$2</$1>");
}
	
System.out.println( input );

Ausgabe:
Code:
<b>Hallo mein <u>name</u> ist <i>Tomate_Salat</i></b>


Version 2.0:
Java:
String[] regex	= 
{
	"(?i)\\[u\\](.*?)\\[\\/u\\]",
	"(?i)\\[b\\](.*?)\\[\\/b\\]",
	"(?i)\\[i\\](.*?)\\[\\/i\\]",
	"(?i)\\[color=(.*?)\\](.*?)\\[\\/color\\]"
};
		
String[] rlp	=
{
	"<u>$1</u>",
	"<b>$1</b>",
	"<i>$1</i>",
	"<color=\"$1\">$2</color>"
};
		
String input	= "[b]Hallo mein [u]name[/u] [color=blue]ist[/color] [i]Tomate_Salat[/i][/b]";		
		
for(int i = 0; i < regex.length; i++)
{
	input	= input.replaceAll(regex[i], rlp[i]);
}
		
System.out.println( input );

Ausgabe:
Code:
<b>Hallo mein <u>name</u> <color="blue">ist</color> <i>Tomate_Salat</i></b>
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
E Reguläre Ausdrücke: String-Ersetzung Allgemeine Java-Themen 0
G Reguläre Ausdrücke Allgemeine Java-Themen 11
G Reguläre Ausdrücke Allgemeine Java-Themen 2
S Reguläre Ausdrücke: Polynomterme Allgemeine Java-Themen 14
jstei001 Reguläre Ausdrücke bearbeiten/ändern Allgemeine Java-Themen 14
C reguläre Ausdrücke finden nicht was sie finden sollen Allgemeine Java-Themen 8
J String für reguläre Ausdrücke escapen Allgemeine Java-Themen 2
C Reguläre Ausdrücke - X{0}?.* Allgemeine Java-Themen 8
C Reguläre Ausdrücke, String rückwärts durchsuchen Allgemeine Java-Themen 6
I Reguläre Ausdrücke und das "~" Symbol Allgemeine Java-Themen 2
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
H Regex - Reguläre Ausdrücke Allgemeine Java-Themen 3
A Reguläre Ausdrücke vereinfachen Allgemeine Java-Themen 19
J Reguläre Ausdrücke Allgemeine Java-Themen 14
A Zufallswerte für reguläre Ausdrücke Allgemeine Java-Themen 15
G Reguläre Ausdrücke Allgemeine Java-Themen 8
R reguläre Ausdrücke Allgemeine Java-Themen 2
L Reguläre Ausdrücke und Fehlerbehandlung Allgemeine Java-Themen 10
RaoulDuke Reguläre Ausdrücke - Daten extrahieren Allgemeine Java-Themen 3
L reguläre Ausdrücke? Allgemeine Java-Themen 2
R Reguläre Ausdrücke (mehrzeilig) Allgemeine Java-Themen 2
C Reguläre Ausrücke Punkte im Satz richtig erkennen Allgemeine Java-Themen 6
E Reguläre Txt in Tree parsen Allgemeine Java-Themen 2
J Reguläre Ausrücke - Klammer nicht vorhanden Allgemeine Java-Themen 2
B kontextfreie grammatik / reguläre grammatik Allgemeine Java-Themen 2
P reguläre ausrücke und String.matches Allgemeine Java-Themen 4
S Reguläre Ausdruecke! Allgemeine Java-Themen 5
A Lambda-Ausdrücke Allgemeine Java-Themen 5
M Lambada Ausdrücke - wie funktionieren und benutzt man sie? Allgemeine Java-Themen 5
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
R Logische Ausdrücke in Java Allgemeine Java-Themen 4
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
H Geklammerte Ausdrücke nach Divide&Conquer Allgemeine Java-Themen 2
B Parser für logische Ausdrücke Allgemeine Java-Themen 9
J Expression Language für mathematische Ausdrücke Allgemeine Java-Themen 8
B Regeuläre Ausdrücke Allgemeine Java-Themen 8
G arithmetische ausdrücke Allgemeine Java-Themen 5
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
T Parser für BBCode? Allgemeine Java-Themen 3
R konvertierung von bbcode <-> html Allgemeine Java-Themen 5
T Suche BBCode-Parser in Java Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben