BBCode IMG Formatieren PHP/JavaScript?

Hannibal

Erfahrenes Mitglied
Guten Abend

Ich setze bei meinem Forum Script eine BBCode Funktion ein.Diese verüfügt für den IMG TAG über folgende Ausgabe:

PHP:
$entry = eregi_replace("\[img\]([^\[]+)\[/img\]","<img src=\"\\1\" border=\"0\">",$entry);

Nun sieht dass bei mir so aus dass ich möchte dass die Bilder max 500pixel breit angezeigt werden.

Ich kann aber nicht fix in den IMG Tag widht= eingeben. weil sonst die Bilder welche kleiner sind verzogen werden. Logisch.

Nun möchte ich gerne so eine Art Funktion wie sie z.B. das neuere WBB hat. Dass halt einfach wenn ein Bild über 500px ist dieses als Vorschau angezeigt wird und man die Originalgrösse anzeigen kann.

Dies können aber Bilder sein welche nur aus dem WWW verlinkt sind oder sie liegen zufällig auf meinem Server. Also muss das ganze beim Anzeigen des Beitrages bearbeitet werden.

Gibt es da eine möglichkeit mit PHP oder würdet ihr das eher auf JavaScript Basis sehen? Hat schon jemand so eine Funktion auf lager?

Vielen Dank
Hannibal
 
Dr Dau hat gesagt.:
Hallo!

getimagesize() ist Dein Freund (funktioniert auch mit Remote-Dateien).
Mein Code sollte Dir da eigentlich schon weiterhelfen.

Gruss Dr Dau

Aha Ok dass sollte mir eigentlich soweit weiterhelfen. Doch leider habe ich ein Problem damit diesen Code in die preg_replace Funktion einzubauen.

Diese sieht so aus:

PHP:
function bbcodes($text)
  {
    $neuertext = stripslashes($text);
    $neuertext = preg_replace("/\[img\](.*)\[\/img\]/isU", "<img src=\"$1\" border='0' />", $neuertext);
    $neuertext = preg_replace("/\[center\](.*)\[\/center\]/isU", "<center>$1</center>", $neuertext);
..usw.

Nun müsste ich doch die neuen IMG Befehle an dieser Stelle einfügen $neuertext = preg_replace("/\[img\](.*)\[\/img\]/isU",

Denn wenn ich vorher auf diese $1 zugreife geht das nicht.
 
Hannibal hat gesagt.:
Denn wenn ich vorher auf diese $1 zugreife geht das nicht.
Verstehe irgendwie nicht ganz..... $1 muss doch irgendwo her kommen.
Abgesehen davon, irgendwie habe ich es in Erinnerung dass ein Variablenname nicht mit einer Zahl beginnen darf.
 
Dr Dau hat gesagt.:
getimagesize() ist Dein Freund (funktioniert auch mit Remote-Dateien).
Allerdings nur, wenn allow_url_fopen aktiviert ist – was generell nicht empfehlenswert ist. Außerdem sollte hierbei im Hinterkopf behalten werden, dass dadurch bei jedem Aufruf dieser Funktion mit einer Remote-URL als Parameter die komplette Datei auf den Server übertragen wird (mitsamt aller hierbei möglichen Komplikationen).

Dr Dau hat gesagt.:
Verstehe irgendwie nicht ganz..... $1 muss doch irgendwo her kommen.
Abgesehen davon, irgendwie habe ich es in Erinnerung dass ein Variablenname nicht mit einer Zahl beginnen darf.
Hierbei handelt es sich um Referenzen auf die Gruppierungen des regulären Ausdrucks. Näheres dazu findet sich auf der Handbuchseite zu [phpf]preg_replace[/phpf].

Zum eigentlichen Thema: wenn du das Suchergebnis vor dem Ersetzen weiterverarbeiten willst, empfiehlt sich die Funktion [phpf]preg_replace_callback[/phpf]. Bei dieser kann eine Callback-Funktion angegeben werden, die mit den Trefferdaten als Parameter aufgerufen und deren Rückgabewert als Ersatz für den Treffer verwendet wird.

Zu der Sache mit den Bildgrößen gibt es unter den gegebenen Restriktionen leider keine einfache Lösung. Am besten wäre wirklich, wenn du die Bilder für diesen Zweck auf deinen Server speicherst.

Grüße,
Matthias
 
Matthias Reitinger hat gesagt.:
Allerdings nur, wenn allow_url_fopen aktiviert ist
Jetzt wo Du es sagst, klingt es irgendwie logisch..... steht aber nichts davon im PHP-Manual. :(
Matthias Reitinger hat gesagt.:
Hierbei handelt es sich um Referenzen auf die Gruppierungen des regulären Ausdrucks. Näheres dazu findet sich auf der Handbuchseite zu [phpf]preg_replace[/phpf].
Versuche lieber erst garnicht mir preg_replace() zu erklären.
Gelesen habe ich dazu schon viel, rumprobiert auch..... aber verstehen tue ich praktisch NULL. :(
Da werde ich ihm also wohl nicht weiter helfen können. :(
Matthias Reitinger hat gesagt.:
Am besten wäre wirklich, wenn du die Bilder für diesen Zweck auf deinen Server speicherst.
Dann sollte er dass einbinden von externen Bildern aber auch unterbinden..... sonst macht es ja nicht viel Sinn. ;)
Evtl. währe es ja eine Alternative externe Verlinkungen lediglich als Textlink anzeigen zu lassen.
 
Ich habe für die BBCodes mal folgende Funktion gefunden und diese eingebunden. Diese verarbeitet mir $text zu $neuertext.

Und nun komme ich leider nicht dahinter wie ich dieses IMG editieren in diese Funktion hineinbringe.

Die Bilder dürfen einfach nicht über 500px breit werden. Aber auch Bilder die kleiner sind müssen sauber angezeigt werden.

PHP:
function bbcodes($text)
  {
      $neuertext = stripslashes($text);
    $neuertext = preg_replace("/\[img\](.*)\[\/img\]/isU", "<img src=\"$1\" border='0' />", $neuertext);
    $neuertext = preg_replace("/\[center\](.*)\[\/center\]/isU", "<center>$1</center>", $neuertext);
      $neuertext = preg_replace("/\[b\](.*)\[\/b\]/isU", "<b>$1</b>", $neuertext);
      $neuertext = preg_replace("/\[i\](.*)\[\/i\]/isU", "<i>$1</i>", $neuertext);
      $neuertext = preg_replace("/\[u\](.*)\[\/u\]/isU", "<u>$1</u>", $neuertext);
      $neuertext = eregi_replace("([ \r\n])www\\.([^ ,\r\n]*)","\\1http://www.\\2",$neuertext);
      $neuertext = eregi_replace("([ \r\n])http\:\/\/www\\.([^ ,\r\n]*)","\\1http://www.\\2",$neuertext);
      $neuertext = preg_replace("/\[url\]www.(.*)\[\/url\]/isU", "http://www.$1", $neuertext);
    $neuertext = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/", "<a href=\"\\1\" target='_blank'>\\2</a>", $neuertext);
    $neuertext = preg_replace("/\[url\](.*)\[\/url\]/isU", "<a href='$1' target='_blank'>$1</a>", $neuertext);
    $neuertext = preg_replace("/\[red\](.*)\[\/red\]/isU", "<font color='red'>$1</font>", $neuertext);
    $neuertext = preg_replace("/\[blue\](.*)\[\/blue\]/isU", "<font color='blue'>$1</font>", $neuertext);
    $neuertext = preg_replace("/\[yellow\](.*)\[\/yellow\]/isU", "<font color='yellow'>$1</font>", $neuertext);
    $neuertext = preg_replace("/\[size=(.*)\](.*)\[\/size\]/isU", "<font size='$1'>$2</font>", $neuertext);
    $neuertext = preg_replace("/\[quote\](.*)\[\/quote\]/isU", "<table border='1' cellspacing='0' cellpadding='2' bgcolor='EFEFEF' width='95%' align='center'><tr><td>$1</tr></td></table>", $neuertext);
    $neuertext = preg_replace("/\[quote=(.*)\](.*)\[\/quote\]/isU", "<table border='1' cellspacing='0' cellpadding='2' bgcolor='EFEFEF' width='95%' align='center'><tr><td><i>Orginal von $1:</i><br><br>$2</tr></td></table>", $neuertext);
      return $neuertext;
  }
 
Ich habe dazu mal ein Script geschrieben:

PHP:
//Bilder zählen (BB-Code)
$zeichenkette = "[ img]bild1.jpg[ /img] text usw. [ img]bild2.gif[ /img] ... ";
$found = preg_match_all('{\[ img\]}',$zeichenkette,$found);

        //Schleife so oft durchgehen, wie Bilder vorhanden sind
        for($i = 0; $i < $found; $i++)
        {
            preg_match('{\[ img\](.*)\[ /img\]}smUi', $zeichenkette, $treffer);

            if($treffer[1] != ""){
                $size = getimagesize("$treffer[1]");
                $breite = $size[0];

                if($breite > 500){
                    $zeichenkette = preg_replace('{\[ img\](.*)\[ /img\]}smUi','<a href="\\1" target="blank"><img src="\\1" width="500" alt=""></a>',$zeichenkette,1);
                }
                else{
                    $zeichenkette = preg_replace('{\[ img\](.*)\[ /img\]}smUi','<img src="\\1" alt="">',$zeichenkette,1);
                }
            }

        }


Das Script macht folgendes:

Zuerst werden alle img-Tags gezählt, damit die Schleife weiß, wie oft sie durchlaufen muss. Bei Jedem Durchgang wird die Adresse des gefundenen img ausgelesen. Anschließend wird die Breite geholt (funktioniert auch mit fremdverlinkten Bildern) und geprüft, ob das Bild breiter als 500px ist. Wenn ja, wird das width-Attribut gesetzt und automatisch verlinkt. Fertig.

Gruß,

PCP
 
Matthias Reitinger hat gesagt.:
Hallo,

hast du dir meinen Beitrag eigentlich überhaupt durchgelesen?

Grüße,
Matthias

Hi, entschuldigung ich war so darauf vertieft den andere Code gleich zu testen.

Zu den Komplikationen, ich gehe mal davon aus dass ich nun mitem im Forum ne Fehlermeldung haben werden wenn jemand einen Death-Link postet. Dazu ist es wohl auch nicht gerade gut wenn andere Dateien als Bilder in den IMG Tag kommen

Ich kenne das mit dem Bild und darunter den Satz "Volle Bildgrösse anzeigen" einfach vom WBB und das finde ich wirklich eine nützliche Sache wenn man externe Bilder erlaubt.

Wegen den ganzen Server Problemen die auftauchen können, wäre es wohl wie schon in Titel angedeutet villeicht schlau da eine JavaScript Lösung zu suchen?

Ich habe das letze Script nun mal ausprobiert und das ist an sich wirklich eine Super Sache, dass geht. Nur eben die Probleme die das bereiten kann.

Ich würde mal sagen ich kann froh sein das die IMG Tags nun wieder gehen und ich nicht dauernd beiträge editieren muss. Aber eine entgültige Lösung darf dass nicht sein.

Gruss

Nachtrag: Nun habe ich leider das problem dass mir keine Umbrüche mer angezeigt werden. Bei der Ausgabe sind alle Zeichen einfach hintereinander. Wie verhindere ich denn sowas?
 
Zuletzt bearbeitet:
Zurück