Alternate 1

PHP Suchen und Ersetzen in einem String - etwas spezieller

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
Hallo,

ich lese einen Datensatz aus der DB, darin enthalten sind nun folgende Zeichen:

PHP:
{IMG:bild_urlaub_1.jpg}
{IMG:small_junior_1year.jpg}
{IMG:hans_klein.png}

Diese möchte ich nun Umwandeln nach:

HTML:
<img src=bild_urlaub_1.jpg>
<img src=small_junior_1year.jpg>
<img src=hans_klein.png>

wie kann ich danach suchen und den dateinamen herausfiltern?
 
Stichwort: Regular Expressions / Reguläre Ausdrücke. Google danach und mach dich schlau.
 
@leboh: nein, das ist es leider nicht.

@Timmey92/@voodoo44: ja damit setze ich mich gerade auseinander, bei mir hapert es nur mit dem entsprechendem ausdruck für das suchmuster *narf*
 
Entweder mit RegularExpressions und preg_replace, oder von Hand mit str_replace.

Code:
$filenames = array();
$lines = explode("{", $string);
foreach ($lines as $line) {
    $filenames[] = str_replace(array('IMG:', '}'), '', $line);
}
var_dump($filenames);


Btw wäre deine Einbindung der Bilder nicht standardkonform.
So wäre es richtig:
Code:
<img src="dateiname.jpg" alt="" />
Alt ist ein Pflichtattribut und man schließt jedes Tag auch wieder. Anführungsstriche sollten ebenfalls nicht fehlen.
 
Zuletzt bearbeitet:
also ich spreche kein Wort php... aber ich wuerde
} durch > ersetzen und {IMG: durch <img src= und ich bin fertig...
Ergänzung ()

@timmy92: Deine Homepage spuckt PHP Fehler :-)
 
Im Grunde ist das ja BBCode, nur eben mit {} anstelle von [] und : statt =.

Google + regex + bbcode wird dir helfen. Dann ersetzt du in den Scripten nur noch die []/= durch {}/:.
 
Weiß nicht, ob man hier regex nehmen sollte.

Du weißt ja im Endeffekt, dass der String jeweils zwischen ":" und "}" eingeschlossen ist.

Natürlich - im Prinzip ein regex-matching auf 1 Zeichen, aber das ist zu primitiv.
 
@Leboh: Liegt wohl daran das ich die php dateien gelöscht habe oder die Datenbank :p
Keine Zeit mehr die zu pflegen also off genommen.

regex ist gar nicht so schwierig, man muss sich nur ein wenig damit beschäftigen, wenn man es erst mal raus hat geht das wie von selbst ;)
 
leboh hat Recht. Bei sowas Einfachem ist keine Regex noetig.

Du kannst einfach "{IMG:" und "}" durch "" ersetzen und hast dann den Dateinamen. Was du mit dem machst, ist dann deine Sache.

In den allermeisten Fällen ist die einfachste Lösung zu bevorzugen.
 
Wer sagt, dass der String nur daraus besteht? Und was ist wenn sich im Dateinamen ein } befindet?
Code:
echo preg_replace( '#{IMG:(.*[jpg|png])}#', '<img src="$1">', '    {IMG:bild_urlaub_1.jpg}
    {IMG:small_junior_1year.jpg}
    {IMG:hans_klein.png}' )
 
Guter Punkt. Aber wer sagt, dass es nur jpg und png sind? Was ist, wenn sich im Dateinamen "{IMG:" befindet? Etc.

Natürlich muss die Lösung den Anforderungen gerecht werden. Wenn es einfach geht, dann sollte man es einfach machen. Ansonsten eben mit einer Regex.
 
Zuletzt bearbeitet:
ich habe mich nun für BBCode entschieden.
Es ist einfacher das Format zu Ändern anstelle das Rad neu zu erfinden ;)

Danke euch für die vielen Ideen!

PHP:
function replaceBBCode($text) {
        $text = preg_replace("/\[IMG\](.*)\[\/IMG\]/Usi", "<img src='".UPLOAD_DIR."\\1' alt='' />", $text);
        return $text;
    }
 
Die Dateitypen kann er ja noch erweitern, ggf. abändern in [A-Za-z{3,4}], was zwar weniger genau und restriktiv ist, aber evtl. weniger Wartung bedeutet. Eventuell noch ein i als Modifikator dranhängen, falls diese auch noch unterschiedlich geschrieben werden.

Wenn im Dateinamen ein {IMG:} mit drin steckt, interessiert das den Regexp überhaupt nicht.

Ausgabe von obigem Script:
Code:
<img src="bild_urlaub_1.jpg">
<img src="small_junior_1year.jpg">
<img src="hans_klein.png">
<img src="{IMG:blabla.jpg}.png">
Das Script von oben würde alles zerpflücken.
Code:
$string = '{IMG:bild_urlaub_1.jpg}
{IMG:small_junior_1year.jpg}
{IMG:hans_klein.png}
{IMG:{IMG:blabla.jpg}.png}';

$filenames = array();
$lines = explode("{", $string);
foreach ($lines as $line) {
  $filenames[] = str_replace(array('IMG:', '}'), '', $line);
}
var_dump($filenames);
Code:
array(6) {
  [0]=>
  string(0) ""
  [1]=>
  string(19) "bild_urlaub_1.jpg
"
  [2]=>
  string(24) "small_junior_1year.jpg
"
  [3]=>
  string(16) "hans_klein.png
"
  [4]=>
  string(0) ""
  [5]=>
  string(14) "blabla.jpg.png"
}
Dein Script würde auch daran scheitern:
Code:
<img src="bild_urlaub_1.jpg">
<img src="small_junior_1year.jpg">
<img src="hans_klein.png">
<img src="<img src="blabla.jpg">.png">
Speziell bei variablen Sachen wie einer Einbindung von Dateinamen, welche gefiltert werden müssen, würde ich nie und nimmer starre Folgen nutzen. Eine Ausnahme wäre Zeichenbegrenzer zu nutzen, welche in keinem Dateisystem erlaubt sind (fällt schon schwerer diese zu finden, mir fällt da spontan nur der Doppelpunkt ein). Nur hat es sich dann mit der Usuability ein wenig schräg, wenn ich :IMG:dateiname.jpg: als Formatierung nutze. Mag zwar auch seine Vorteile haben, ergibt für mich aber genau null Sinn.
 
Jo hast Recht.

Dateien mit ":" sind übrigens kein Problem:

3Wvbp.png
 
Hm also doch. Wie trennt Linux dann korrekt die $PATH-Variable? Die sind afaik doch auch mit : getrennt, wie unter Windows mit ;.
 
Muss vermutlich escaped werden. Der Doppelpunkt macht aber sowieso lauter Probleme. SCP kommt damit anscheinend auch nicht richtig klar, weder mit \ noch mit double quotes. Das ist der Preis der Freiheit. :p

Bei uns auf der Website werden Dateien nicht angenommen (bzw. eben sanitized), wenn Zeichen vorkommen, die Windows nicht erlaubt. Das erspart einiges an Kopfzerbrechen.

Zumal Windows-User Dateien mit manchen obskuren Zeichen herunterladen und speichern, aber nicht mehr (per GUI) löschen oder umbenennen können. Schönes Fettnäpfchen.
 
Zuletzt bearbeitet:
Yuuri schrieb:
Wer sagt, dass der String nur daraus besteht? Und was ist wenn sich im Dateinamen ein } befindet?
Wirft man ne StupidFileNameException und geht zum nächsten Eintrag weiter :D
 
Code:
if( preg_match( '#.*#', $filename ) == 1 )
  SuchDirEinAnderesSpielzeug();
? :D
 
Zurück
Oben