Polowonix
Anmeldungsdatum: 18. Juli 2012
Beiträge: 98
Wohnort: Mecklenburg
|
Hallo,
ich arbeite gerade an einem kleinen Web-CMS um mich mal wieder etwas mit PHP auseinanderzusetzen und habe folgendes Problem, für das ich einfach keine Lösung finde:
Ich habe eine Funktion die BBCode in HTML tags umwandeln soll:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | <?PHP
function bbcodeinhtml($bbcode,$font,$ext) { //Übergabe text mit bbcode,font erlaubt(boolean),externes einbinden erlaubt(boolean), Rückgabe html code
$srcbbcode=array("/\[b\](.+)\[\/b\]/s","/\[i\](.+)\[\/i\]/s","/\[u\](.+)\[\/u\]/s","/\[s\](.+)\[\/s\]/s","/\[center\](.+)\[\/center\]/s","/\r/","/\[\*\](.+)\[\/list/","/\[\*\](.+)\n/","/\n\n/s","/\n/","/\[list\=1\](.+)\[\/list=1\]/s","/\[list\=i\](.+)\[\/list=i\]/s","/\[list\=a\](.+)\[\/list=a\]/s","/\[list\](.+)\[\/list\]/s");
$srchtml=array("<b>$1</b>","<i>$1</i>","<u>$1</u>","<s>$1</s>","<center>$1</center>","","<li>$1</li>[/list","<li>$1</li>","</p><p>","<br>","<ol>$1</ol>","<ol type='i'>$1</ol>","<ol type='a'>$1</ol>","<ul>$1</ul>");
if($font) {
array_push($srcbbcode,"/\[font\=(.+)\](.+)\[\/font\]/s","/\[color\=(.+)\](.+)\[\/color\]/s","/\[size\=(.+)\](.+)\[\/size\]/s");
array_push($srchtml,"<font face='$1'>$2</font>","<font color='$1'>$2</font>","<font size='$1'>$2</font>");
}
if($ext) {
array_push($srcbbcode,"/\[url\=(.+)\](.+)\[\/url\]/","/\[img\](.+)\[\/img\]/","/\[hl\](.+)\[\/hl\]/");
array_push($srchtml,"<a href='$1' target='blank'>$2</a>","<img src='$1'>","<h2>$1</h2>");
}
$transtext=preg_replace($srcbbcode,$srchtml,$bbcode);
return $transtext;
}
?>
|
Das Problem ist, wenn ich einen BBCode mehrfach verwende, z.B. Das ist [b]Fett[/b] und das [b]auch[/b]
Das Ergebnis sieht aber so aus: Das ist Fett[/b] und das [b]auch
Er nimmt immer den ersten öffnen tag und den letzten schließen tag und ignoriert alles dazwischen. Weiß jemand eine Lösung, ich bin für jede Hilfe dankbar.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Polowonix schrieb:
Er nimmt immer den ersten öffnen tag und den letzten schließen tag und ignoriert alles dazwischen. Weiß jemand eine Lösung, ich bin für jede Hilfe dankbar.
Ja: Du kannst die Quantifier durch Anhängen eines Fragezeichens "lazy" machen (🇬🇧 Doku). Dann finden sie jeweils den ersten schließenden Tag.
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Das liegt an deinem regulären Ausdruck. Quantoren sind standardmäßig greedy ("gierig"). Ich empfehle dir mal die Wikipedia-Seite zu regulären Ausdrücken durchzulesen. In deinem Fall (pcre = perl compatible regular expression) kann man das verhindern indem man dem Quantor ein Fragezeichen nachstellt:
\[b\](.+?)\[\/b\]
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Ein Beispiel: /\[font\=(.+)\](.+)\[\/font\]/s ▶ /\[font\=(.+?)\](.+?)\[\/font\]/s In diesem Fall würde ich das erste Muster auch noch etwas anders machen: /\[font\=([^\]]+)\](.+?)\[\/font\]/s Edit: Hervorhebung korrigiert.
|
Polowonix
(Themenstarter)
Anmeldungsdatum: 18. Juli 2012
Beiträge: 98
Wohnort: Mecklenburg
|
OK, danke. Eigentlich habe ich halb php.net durchwühlt, aber das irgendwie nicht gefunden oder überlesen... 🙄 Naja, vielen Dank. Hier die aktuelle Funktion:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | function bbcodeinhtml($bbcode,$font,$ext) { //Übergabe text mit bbcode,font erlaubt(boolean),externes einbinden erlaubt(boolean), Rückgabe html code
$srcbbcode=array("/\[b\](.+?)\[\/b\]/s","/\[i\](.+?)\[\/i\]/s","/\[u\](.+?)\[\/u\]/s","/\[s\](.+?)\[\/s\]/s","/\[center\](.+?)\[\/center\]/s","/\r/","/\[\*\](.+?)\[\/list/","/\[\*\](.+?)\n/","/\n\n/s","/\n/","/\[list\=1\](.+?)\[\/list=1\]/s","/\[list\=i\](.+?)\[\/list=i\]/s","/\[list\=a\](.+?)\[\/list=a\]/s","/\[list\](.+?)\[\/list\]/s");
$srchtml=array("<b>$1</b>","<i>$1</i>","<u>$1</u>","<s>$1</s>","<center>$1</center>","","<li>$1</li>[/list","<li>$1</li>","</p><p>","<br>","<ol>$1</ol>","<ol type='i'>$1</ol>","<ol type='a'>$1</ol>","<ul>$1</ul>");
if($font) {
array_push($srcbbcode,"/\[font\=(.+?)\](.+?)\[\/font\]/s","/\[color\=(.+?)\](.+?)\[\/color\]/s","/\[size\=(.+?)\](.+?)\[\/size\]/s");
array_push($srchtml,"<font face='$1'>$2</font>","<font color='$1'>$2</font>","<font size='$1'>$2</font>");
}
if($ext) {
array_push($srcbbcode,"/\[url\=(.+?)\](.+?)\[\/url\]/","/\[img\](.+?)\[\/img\]/","/\[hl\](.+?)\[\/hl\]/");
array_push($srchtml,"<a href='$1' target='blank'>$2</a>","<img src='$1'>","<h2>$1</h2>");
}
$transtext=preg_replace($srcbbcode,$srchtml,$bbcode);
return $transtext;
}
|
|
Polowonix
(Themenstarter)
Anmeldungsdatum: 18. Juli 2012
Beiträge: 98
Wohnort: Mecklenburg
|
und mit der Verbesserung von rklm 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | function bbcodeinhtml($bbcode,$font,$ext) { //Übergabe text mit bbcode,font erlaubt(boolean),externes einbinden erlaubt(boolean), Rückgabe html code
//Fehler: List: mehrere Punkte [*] in einer Zeile
$srcbbcode=array("/\[b\](.+?)\[\/b\]/s","/\[i\](.+?)\[\/i\]/s","/\[u\](.+?)\[\/u\]/s","/\[s\](.+?)\[\/s\]/s","/\[center\](.+?)\[\/center\]/s","/\r/","/\[\*\](.+?)\[\/list/","/\[\*\](.+?)\n/","/\n\n/s","/\n/","/\[list\=1\](.+?)\[\/list=1\]/s","/\[list\=i\](.+?)\[\/list=i\]/s","/\[list\=a\](.+?)\[\/list=a\]/s","/\[list\](.+?)\[\/list\]/s");
$srchtml=array("<b>$1</b>","<i>$1</i>","<u>$1</u>","<s>$1</s>","<center>$1</center>","","<li>$1</li>[/list","<li>$1</li>","</p><p>","<br>","<ol>$1</ol>","<ol type='i'>$1</ol>","<ol type='a'>$1</ol>","<ul>$1</ul>");
if($font) {
array_push($srcbbcode,"/\[font\=([^\]]+)\](.+?)\[\/font\]/s","/\[color\=([^\]]+)\](.+?)\[\/color\]/s","/\[size\=([^\]]+)\](.+?)\[\/size\]/s");
array_push($srchtml,"<font face='$1'>$2</font>","<font color='$1'>$2</font>","<font size='$1'>$2</font>");
}
if($ext) {
array_push($srcbbcode,"/\[url\=([^\]]+)\](.+?)\[\/url\]/","/\[img\](.+?)\[\/img\]/","/\[hl\](.+?)\[\/hl\]/");
array_push($srchtml,"<a href='$1' target='blank'>$2</a>","<img src='$1'>","<h2>$1</h2>");
}
$transtext=preg_replace($srcbbcode,$srchtml,$bbcode);
return $transtext;
}
|
Wenn ich es richtig verstanden habe, bedeutet
([^\]]+)
jedes Zeichen bis zum nächsten
]
, oder?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Polowonix schrieb:
Wenn ich es richtig verstanden habe, bedeutet
([^\]]+)
jedes Zeichen bis zum nächsten
]
, oder?
Mindestens ein beliebiges Zeichen, das kein "]" ist.
|