PHP Problem mit file_exist

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo,

ich habe eine kleine Funktion die überprüfen soll, ob das Bild existiert oder nicht.

PHP:
    public function checkFileExist($filename) {
        echo UPLOAD_DIR."_".$filename."<br />";
        if(file_exists(UPLOAD_DIR.$filename)) {
            return "<img src='".UPLOAD_DIR.$filename."' alt='' />";
        } else {
            return "Fehler bei der Darstellung von: ".$filename;
        }
    }

aufgerufen wird diese über:

PHP:
    public function replaceBBCode($text) {
        $text = preg_replace("/\[img\](.*)\[\/img\]/Usi", $this->media->checkFileExist("\\1"), $text);
        return $text;
    }

Der Output ist mehr als komisch:

upload/_\1
Fehler bei der Darstellung von: small_3d.png

Für die zusammenstellung des file_exist wird nicht \\1 übergeben sondern \1, für die Ausgabe aber \\1.

Hat jemand eine Idee?
 
Der Output ist vollkommen korrekt.
Code:
<pre><?php

function myfe( $a, $b )
{
	$ret = '';
	echo 'in '.__METHOD__.": ".$a.", ".$b."\n";
	$ret = $b.$a.$b;
	echo 'return '.__METHOD__.": ".$ret."\n";
	return $ret;
}

function mypr( $p, $r, $c )
{
	$ret = '';
	echo 'in '.__METHOD__.": ".$p.", ".$r.", ".$c."\n";
	$ret = preg_replace( $p, $r, $c );
	echo 'return '.__METHOD__.": ".$ret."\n";
	return $ret;
}

echo mypr( '#(a)#', myfe( '\1', '---' ), 'asdwbiafdhbweiodfweiofnhawöeoifwifjwef' )."\n";

?></pre>
Code:
in myfe: \1, ---
return myfe: ---\1---
in mypr: #(a)#, ---\1---, asdwbiafdhbweiodfweiofnhawöeoifwifjwef
return mypr: ---a---sdwbi---a---fdhbweiodfweiofnh---a---wöeoifwifjwef
---a---sdwbi---a---fdhbweiodfweiofnh---a---wöeoifwifjwef
Kurzum gesagt: die Funktionen bekommen nicht den ersten Hit, sondern \1. \1 wird erst innerhalb von preg_replace() ersetzt. Dein Aufruf ist aber vor preg_replace().

Fix: preg_match und mit dessen hits ersetzen.
 
okay,

PHP:
        if(preg_match("/\[img\](.*)\[\/img\]/Usi", $text, $treffer)) {
                $text_treffer = preg_replace("/\[img\](.*)\[\/img\]/Usi", "\\1", $treffer['0']);
                $text = preg_replace("/\[img\](.*)\[\/img\]/Usi", $this->media->checkFileExist($text_treffer), $text);
        }

macht das schonmal, jetzt ist aber das problem, wenn ich 2 bilder habe, ersetzt er beide bilder mit dem gleichen bild ...
 
Warum matchst du und nimmst nicht dessen Resultate? Genau deswegen ersetzt er ja jegliche Bilder.
Code:
<?php

if( preg_match_all( '#pattern#', $sub, $hits ) > 0 )
	foreach( $hits[$index] as $i => $k )
	{
		$fullmatch = $hits[0][$i];
		$filename = $hits[1][$i];
		// ...
		
		$sub = str_replace( $fullmatch, '<img src="'.$filename.'">', $sub );
	}
So holst du dir alle Treffer, hast dessen Dateinamen und kannst damit anstellen was du willst. Daten sammeln, verarbeiten, weitergeben - nie anders.
 
danke. ich hab das nun angepasst nach deinem Beispiel:

PHP:
        if(preg_match_all("/\[IMG\](.*)\[\/IMG\]/", $text, $hits) > 0) {
            foreach( $hits[] as $i => $k ) {
                $fullmatch = $hits[0][$i];
                $filename = $hits[1][$i];
                $text = str_replace($fullmatch, $this->media->checkFileExist($filename), $text);
            }
        }

allerdings musste ich das $index rausnehmen, erst dann hat er reagiert.

was ich aber nicht verstehe:
ich habe 3 bilder gespeichert:

HTML:
Das hier ist ein Contenteintrag

[IMG]small_Bildschirmfoto 2012-08-26 um 14.08.20.png[/IMG]

[IMG]small_Bildschirmfoto 2012-08-27 um 21.36.00.png[/IMG]

[IMG]small_Bildschirmfoto 2012-08-27 um 22.12.00.png[/IMG]

angezeigt werden aber nur die ersten 2, das dritte bleibt leer.
 
Den $index benötigst du, da du ja alle Hits durchgehen willst, je nachdem wie viel du matchst. Sieh dir mal den var_dump von $hits an.
Code:
<?php

echo '<pre>';

$content = 'Das hier ist ein Contenteintrag

[IMG]small_Bildschirmfoto 2012-08-26 um 14.08.20.png[/IMG]

[IMG]small_Bildschirmfoto 2012-08-27 um 21.36.00.png[/IMG]

[IMG]small_Bildschirmfoto 2012-08-27 um 22.12.00.png[/IMG]';
$hits = array();
if( preg_match_all( '#\[img\](.+)\[/img\]#i', $content, $hits ) > 0 )
	var_dump( $hits );

echo '</pre>';
Code:
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(58) "[IMG]small_Bildschirmfoto 2012-08-26 um 14.08.20.png[/IMG]"
    [1]=>
    string(58) "[IMG]small_Bildschirmfoto 2012-08-27 um 21.36.00.png[/IMG]"
    [2]=>
    string(58) "[IMG]small_Bildschirmfoto 2012-08-27 um 22.12.00.png[/IMG]"
  }
  [1]=>
  array(3) {
    [0]=>
    string(47) "small_Bildschirmfoto 2012-08-26 um 14.08.20.png"
    [1]=>
    string(47) "small_Bildschirmfoto 2012-08-27 um 21.36.00.png"
    [2]=>
    string(47) "small_Bildschirmfoto 2012-08-27 um 22.12.00.png"
  }
}
$hits beinhaltet also für jede gematchte Gruppe einen Eintrag. In [0] ist immer der komplette Match, in [1] die erste Gruppe, [2] die Zweite usw. Geh also nach $hits[0] bspw. durch, dann bekommst du auch deine drei Treffer angezeigt. Du könntest genauso $hits[1] durchgehen, wenn dir bspw. der komplette Match egal ist.
 
ich glaub ich raff es immer noch nicht.

PHP:
       if(preg_match_all("/\[IMG\](.*)\[\/IMG\]/", $text, $hits) > 0) {
            foreach( $hits as $i => $k ) {
                $fullmatch = $hits[0][$i];
                $filename = $hits[1][$i];
                $text = str_replace($fullmatch, $this->media->checkFileExist($filename), $text);
            }
        }

ich nehme den filename aus [1] (ohne img) und ersetze ihn in [0] (mit img) durch aufruf der checkFileExist. das ist OK.

was ich aber nicht immer noch nicht verstehe: var_dump liefert mir pro array 3 ergebnise, 3 bilder. aber es werden nur 2 von 3 bildern in ein IMG umgewandelt.
 
$hits enthält alle Matches inkl. Gruppen.
$hits[0] den kompletten Match
$hits[1] enthält die erste Gruppe
$hits[2] die Zweite
...

Geh also am einfachsten nach $hits[0] durch.
 
Zurück
Oben