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?
 
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.
 
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
 
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
 
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.
 
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
 
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>
 
ändere mal:
Java:
"\\[b\\](.*)\\[\\/b\\]"
zu
Java:
"\\[b\\](.*?)\\[\\/b\\]"
 
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:
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:

Zurück
Oben