[PHP] String mit "nichts" ersetzen?

C

Core2Quad

Gast
Ich habe hier ein Script, dass EXIF-Daten in Bildern in ein Template einfügt.

Dadurch werden Platzhalter im Template durch die EXIF-Daten ersetzt.

Das funktioniert.

Manche Bilder enthalten keine EXIF-Daten, das wird abgefangen und die Platzhalter sollen durch "nichts" ersetzt werden, also soll da gar nichts stehen.

Das funzt aber nicht, es bleiben die Platzhalter stehen.

Das sieht ungefähr so aus:
PHP:
if(extension_loaded('exif')) {
	$curr_image = "$path_to_images/$item[0]";
	$all_exif = @exif_read_data($curr_image,0,true);
    if(!empty($all_exif)) 	{
		$exif_file = @$all_exif['FILE'];
		$exif_IFD0 = @$all_exif['IFD0'];
	//	$comment = @$all_exif['COMMENT'][0];
		$exif = @$all_exif['EXIF'];
		if(!empty($exif)) 	{
			$Blende = $exif['FNumber'];
			if(!empty($Blende)) 	{
				@list($n, $d) = explode('/', $Blende);
				$Blende = $n / $d;
				$Zeit = $exif['ExposureTime'];
				$ISO = $exif['ISOSpeedRatings'];
				$BW = $exif['FocalLength'];
				@list($n, $d) = explode('/', $BW);
				$BW = $n / $d;
				$groesse = $exif_file['FileSize'];
				$groesse = number_format($groesse / 1024,0);
				$dimensions = getimagesize($curr_image);
				$breite = $dimensions[0];
				$hoehe = $dimensions[1];

				$template = str_replace("<BW>","<span class='text8'> - </span><span class='text8'>$BW</span><span class='text8'>mm</span><span class='text8'> | </span>",$template);
				$template = str_replace("<BLENDE>","<span class='text8'>F$Blende</span><span class='text8b'> | </span>",$template);
				$template = str_replace("<ZEIT>","<span class='text8'>$Zeit</span><span class='text8'>s</span><span class='text8'> | </span>",$template);
				$template = str_replace("<ISO>","<span class='text8'>ISO $ISO</span><span class='text8'> | </span>",$template);
				$template = str_replace("<GROESSE>","<span class='text8'>Bildgr&ouml;&szlig;e $groesse<span class='text8'>kB</span></span><span class='text8'> | </span>",$template);
				$template = str_replace("<BREITE>","<span class='text8'>$breite<span class='text8'>x</span></span>",$template);
				$template = str_replace("<HOEHE>","<span class='text8'>$hoehe</span><span class='text8'>px</span>",$template);
				}	
			}
		}		
	else
	{
	$template = str_replace("<BW>",'',$template);
	$template = str_replace("<BLENDE>",'',$template);
	$template = str_replace("<ZEIT>",'',$template);
	$template = str_replace("<ISO>",'',$template);
	$template = str_replace("<GROESSE>",'',$template);
	$template = str_replace("<BREITE>",'',$template);
	$template = str_replace("<HOEHE>",'',$template);
	}
}

Das ersetzen durch "nichts" soll im untersten Teil stattfinden, aber das Script ersetzt <BW> nicht, bzw. läßt es einfach stehen. Wo ist der Fehler? Das Abfangen oben funktioniert, sonst kämen Fehlermeldungen.
 
Sind die EXIF-Daten wirklich nicht vorhanden? Bzw. springst das Skript überhaupt in den else-Zweig?
 
1668mib schrieb:
Klappt denn das Ersetzen der anderen Ausdrücke?

Wenn EXIF-Daten vorhanden sind, sieht es so aus:
HTML:
<span class="text8"> Bild </span><SPAN CLASS='text8'>4 von 61</SPAN><span class='text8'> - </span><span class='text8'>135</span><span class='text8'>mm</span><span class='text8'> | </span><span class='text8'>F2.8</span><span class='text8b'> | </span><span class='text8'>1/1600</span><span class='text8'>s</span><span class='text8'> | </span><span class='text8'>ISO 200</span><span class='text8'> | </span><span class='text8'>Bildgr&ouml;&szlig;e 152<span class='text8'>kB</span></span><span class='text8'> | </span><span class='text8'>780<span class='text8'>x</span></span><span class='text8'>571</span><span class='text8'>px</span><br>
wenn nicht, so:
HTML:
<span class="text8"> Bild </span><SPAN CLASS='text8'>1 von 61</SPAN><BW><BLENDE><ZEIT><ISO><GROESSE><BREITE><HOEHE><br>
Das die Platzhalter in Tags sind, werden sie zwar nicht dargestellt, aber ich kriege falsche Abstände.


tarsonis schrieb:
Macht php keinen Unterschied zwischen '' und ""?

In diesem Fall nicht. Kann aber daran liegen, dass das Script, warum auch immer, wie Inselmann vermutet, nicht in den else-Zweig springt.

Inselmann schrieb:
Sind die EXIF-Daten wirklich nicht vorhanden? Bzw. springst das Skript überhaupt in den else-Zweig?

Das sollte ich vielleicht erst mal sicherstellen. Ich habe mal ein Image ohne EXIFs hochgeladen, das Script fragt ja mehrmals die Daten ab, aber ich kriege sie entweder angezeigt oder die Platzhalter :freaky:
Ergänzung ()

Jetzt ist mir gerade was aufgefallen, ich glaube, der else-Zweig muss zwei Klammer weiter nach oben. Mal sehen.
Ergänzung ()

Goldmember schrieb:
Ergänzung ()

Jetzt ist mir gerade was aufgefallen, ich glaube, der else-Zweig muss zwei Klammer weiter nach oben. Mal sehen.

OK, danke für euren Input, besonders Inselmann :)

Das war's, sehr doofer Fehler, der EXIF-Header ist irgendwie nie ganz leer, deswegen ist es nicht in den Else-Zweig gesprungen.

Kann geschlossen werden.
 
Geht mit auch öfter so. ;)
Ist offline immer schwer auf den ersten Blick zu sehen.
Viel Spaß weiterhin beim Programmieren.
 
Bei der Zeile wo dies steht:
if(!empty($exif))

kann die if-Abfrage ja mit false ausgehen. Genauso bei:
if(!empty($Blende))

Ich nehme an, das dies passiert und in dem Fall ja logischerweise nicht das letzte "else" ausgeführt wird. Demnach ist nicht der Fehler, das str_replace scheinbar nichts tut, sondern das es gar nicht in Aktion kommt. Umgehen könntest du bspw. dies plumb und simpel, wenn du die letzten "str_replace" nicht in dem "else" fängst, sonder prinzipiell ausführst. Damit würde jeder nicht ersetze Platzhalter prinzipiell mit "nichts" ersetzt werden. Hoffentlich klingt das nicht zu verdreht. ^^

EDIT: Hab erst jetzt gesehen, das der Fehler bereits auffiel. Aber vielleicht ist mein Ansatz dennoch interessant genug.
 
Zuletzt bearbeitet:
@Kokuswolf:

Dein Ansatz ist sogar sehr interessant, habe eine neue Ungereimheit entdeckt, die dein Ansatz direkt beheben könnte :D

Danke schon mal, ich melde mich noch mal, wenn der Fehler behoben ist.
 
Ich konnte das Problem gestern lösen (hatte zwischendurch die Lust verloren), der Code sieht jetzt so aus wie unten.
Alle Werte werden einzeln eingelesen und ausgegeben, aber das macht keinen Unterscheid, weil die EXIFs entweder komplett oder gar nicht vorhanden sind.

Das ist jetzt übrigens recycleter und leicht geänderter (Ausgabe) Code von jemand, der mehr davon versteht als ich :D

PHP:
if(extension_loaded('exif')) {

	$curr_image = "$path_to_images/$item[0]";
	$exif = exif_read_data($curr_image,0,true);

		if(isset($exif["EXIF"]["FNumber"])) {
			list($num, $den) = explode("/",$exif["EXIF"]["FNumber"]);
			$Blende  = " - F/" . ($num/$den);
			$template = str_replace("<BLENDE>","<span class='text8'>$Blende</span><span class='text8b'> | </span>",$template);
			}
		else		
			$template = str_replace("<BLENDE>",'',$template);
				
		if(isset($exif["EXIF"]["ExposureTime"])) 
			list($num, $den) = explode("/", $exif["EXIF"]["ExposureTime"]);
			if ($num > $den) {
				$Zeit = "{$num}s";
				$template = str_replace("<ZEIT>","<span class='text8'>$Zeit</span><span class='text8b'> | </span>",$template);
				}
			else if ($num < $den) {
				$den = round($den/$num);
				$Zeit = "1/{$den}s";
				$template = str_replace("<ZEIT>","<span class='text8'>$Zeit</span><span class='text8b'> | </span>",$template);
				}
			else		
				$template = str_replace("<ZEIT>",'',$template);
				
		if(isset($exif["EXIF"]["FocalLength"])) {
			list($num, $den) = explode("/", $exif["EXIF"]["FocalLength"]);
			$BW  = ($num/$den) . "mm | ";
			$template = str_replace("<BW>","<span class='text8'>$BW</span>",$template);
			}
		else		
			$template = str_replace("<BW>",'',$template);
			

		if ( isset($exif["EXIF"]["ISOSpeedRatings"]) )
			$template = str_replace("<ISO>","<span class='text8'>ISO {$exif["EXIF"]["ISOSpeedRatings"]}</span>",$template);
		else
			$template = str_replace("<ISO>",'',$template);
}
 
Zurück
Oben