Archiv verlassen und diese Seite im Standarddesign anzeigen : BBCode zickt.
Hey, ich habe mir einen BBcode mit PHP gemacht den ich mit REgulären Ausdrücken "halb gelöst" habe.
Mein Problem liegt in der Überschneidung.
Hier seht ihr ein Simples Beispiel an einem Tag.
[B ]gregre[B]eeerg[/B ]wfwf[/B ]
(Leerzeichen im tag wegenken,)
Ergibt:
[b]gregre[B-]eeergwfwf[/B-]
nur das was in steht ist nicht fett, und das [ b ] steht noch normal da. sry ich musste es umbauen damit das board es nicht parsed :D
Hier der Reguläre Ausdruck (Mit PHP)
echo preg_replace('/\[b](.*?)\[\/b]/ism','<b>$1</b>','[b]gregre[b]eeergwfwf');
Das ist jetzt nur vereinfacht, eigentlich sind alle Ausdrücke in einem Array etc.
Kann man es irgendwie lösen, dass dieser effekt NICHT passiert?
butterkeks
19.05.2006, 16:39
reicht bei dieser Art von Tag nicht folgendes?
\[(/?)(B|I|U)\] -> <$1$2>
(greedy)
d.h. ich mache aus den [] quasi nur <> und das war's auch...
Übersehe ich da etwas? Habe nie bbcodes o.ä. gebastelt
butterkeks: Mit deinem Ausdruck könnte man ungültiges HTML erzeugen. Also z.B. würde er "blah[U]blubb" annehmen und daraus "blah<u>blubb" machen und das kann unter Umständen das Design der Seite vermurksen.
Nico14: Ich würde vorschlagen, den Ausdruck in einer Schleife solange anzuwenden bis sich Eingabe und Ausgabe nicht mehr unterscheiden.
Jan Krüger
19.05.2006, 23:16
BBCodes sind nichtregulär, also mit regulären Ausdrücken alleine nicht restlos zufriedenstellend verbastelbar. Du könntest also z.B. Jidders Vorschlag befolgen oder gar komplett ohne reguläre Ausdrücke arbeiten.
Sry für die späte antwort aber ich habe es auf einem mittelweg gelöst.
Mit PHP
Hier meine lösung:
[...]
$bb_out = '';
$bb_out = nl2Br($bb_outs);
/*
FORMAT: 'PATTERN,REPLACE' => 'END TAG BBCODE, END TAG HTML CODE',
....
*/
$BBdefault = Array(
'/\[b]/ism,<b>'=>'[\/b],</b>',
'/\[u]/ism,<u>'=>'[\/u],</u>',
'/\[i]/ism,<i>'=>'[\/i],</i>',
'/\[color=(.*?)]/ism,<font style="color: $1">'=>'[\/color],</font>',
'/\[bgcolor=(.*?)]/ism,<font style="background-color: $1">'=>'[\/bgcolor],</font>',
'/\[font=(.*?)]/ism,<font face="$1">'=>'[\/font],</font>',
'/\[size=(.*?)]/ism,<font size="$1">'=>'[\/size],</font>',
'/\[center](.*?)]/ism,<center>'=>'[\/center],</center>',
'/\[left]/ism,<left>'=>'[\/left],</left>',
'/\[right]/ism,<right>'=>'[\/right],</right>',
'/\[highlight]/ism,<font class="highlight">'=>'[\/highlight],</font>',
);
////Los gehts jedes tag hinterinander
foreach ($BBdefault as $key => $value)
{
$split['start'] = explode(',', $key);
$split['end'] = explode(',', $value);
$x = 1;
while ($x > 0)
{
//So kontrolle ob irgendetwas vorhanden ist
if (!preg_match($split['start'][0], $bb_out))
break;
// Starttag schließen
$bb_out = preg_replace($split['start'][0], $split['start'][1], $bb_out, 1);
// Wenn ein Tag vorhanden ist zum schliessen wird es ersetzt.
if (preg_match($split['end'][0], $bb_out))
$bb_out = preg_replace('/\\'.$split['end'][0].'/ism', $split['end'][1], $bb_out, 1);
// Falls kein Tag zum schließen vorhanden ist, wird es per script ans ende gefügt
else
$bb_out = $bb_out.$split['end'][1];
// Wenn kein Vorkommen mehr ist, dann wird die schleife abgebrochen
if (!preg_match($split['start'][0], $bb_out))
$x = 0;
}
}
[...]
Ich finds irgendwie nicht so schön, dass du dir so sicher bist jan,
Deine Hilfe ist zwar schön und gut aber das du nicht alles weist solltest du wissen, und das du dir dann so unheimlich sicher bist...
Bitte erwähne wenn du kein gott auf dem gebiet bist auch mal das du aber nicht 100% weist ob es nicht auch so ginge...
der modifier U hätte gereicht!!!!!!!
hab ich durch zufall in nem anderen php forum gesehen ;)
was mich nur ärgert, dass ich jetzt meinen ganzen bbcode parser so umgebaut habe... und das sind überflüssig viele zeilen nun!!!
jetzt kann ich ihn auch ganz neu schreiben.
Nico, du hast !!!1!11elf!! vergessen :p
Jan Krüger
18.08.2006, 15:36
Dann probier doch mal Folgendes aus:
echo preg_replace('#\(.*?)\#iU', '<b>$1</b>', 'Hallo zusammen!');
# gleichbedeutend mit
# echo preg_replace('#\(.*)\#i', ...
Das Ergebnis sieht so aus:
<b>Hallo[/b] zusammen[b]!</b>
Auch nicht so toll, oder?
Die tatsächliche Lösung ist, das U wegzulassen (oder deine *-Pattern alle ohne ? zu schreiben, also (.*); U dreht lediglich die Bedeutung von ? um), aber stattdessen g zu verwenden. Damit wird der reguläre Ausdruck so oft angewendet, wie er passt. Das ist dann allerdings keine einfache Anwendung eines regulären Ausdrucks mehr, von daher ist meine ursprüngliche Aussage schon korrekt. Ich habe mich nur ein bisschen von deiner Problembeschreibung in die Irre führen lassen: du hattest schon die richtige Lösung, hast sie nur nicht richtig angewendet, und ich habe gewaltsam nach anderen Lösungen gesucht, weil ich quasi aus deiner Anwendung heraus weiter in die gleiche Richtung falsch gedacht habe. ;)
Zu deiner Kritik: ich weiß durchaus, dass ich nicht alles weiß. Deshalb lasse ich bei allen Aussagen, die ich theoretisch beweisen bzw. an verlässlichen Quellen belegen kann, den Zusatz "ich kann nicht dafür garantieren" weg. Damit musst du bei meinen Beiträgen leben, denn jeden Beitrag sinnlos mit "ich weiß nicht alles" aufzublähen... dafür habe ich keine Zeit.
Wenn ich Fehler mache, gestehe ich die ein, wenn mich jemand darauf hinweist. Wenn meine Quellen widerlegt werden, akzeptiere ich das. Theoretische Beweise dagegen sind naturgegeben unfehlbar. Wären damit alle Fälle zu deiner Zufriedenheit abgedeckt? :p
Nico, du hast !!!1!11elf!! vergessen :p
Eine solche Antwort auf eine durchaus gerechtfertigte Kritik lässt auf ein sehr .. naja, begrenztes Auffassungsvermögen blicken.
Bitte überlege dir doch beim nächsten Mal doppelt, ob es sinnvoll ist, eine sinnlose, spamartige Antwort auf ein ernstes Thema zu posten um dir so deine Seriösität und ein gewisses geistiges Alter zu wahren.
Gruß
Dr-Saar
P.S: Meine Antwort kann man in der Tat durchaus auch als Spam deuten, aber wenigstens enthält sie einen Text, der länger als 39 Zeichen ist, wovon nicht die Hälfte aus Ausrufezeichen, Leerzeichen, einem Smiley und der Ziffer 1 sowie der Zeichenkette 'elf' besteht. Außerdem soll mein Post ein Anstoß zum Denken sein und nicht sinnlos andere Leute "niedermachen", um sich der Community als "cooler Typ" zu zeigen.
Ein entsprechend ausgeprägtes und gebildetes Gehirn wird sich jetzt überlegen, ob es angebracht ist, hierauf zu antworten und wenn ja, in welcher Weise.
Ich wollte nur aufzeigen, dass mehrere Ausrufezeichen eine Aussage weder richtiger oder wichtiger machen. Gegen die Kritik als solches hab ich ja kein Wort verloren. Was hat damit das "geistige Alter" zu tun?
[...] Theoretische Beweise dagegen sind naturgegeben unfehlbar. Wären damit alle Fälle zu deiner Zufriedenheit abgedeckt? :p
jo :D
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.