• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Problem bei der weiterverarbeitung von externem Text mittels PHP

Crashdown

New member
Hallo liebe Community,
ich schreibe gerade an einer kleinen Anwendung für mich selbst und wollte dabei dei BildsuchAPI von Bing verwenden. Da die Ergebnisse der API allerdings erheblich schlechter ausfallen als die der online Suchmaschine habe ich mir ein kleines Script gebastelt, welches aus der Suchmaschine die Adressen der Bilder herausfiltert. Mein Code sieht ungefähr so aus:
PHP:
$keywords = "sushi";
$url = "http://www.bing.com/images/search?q=".rawurlencode($keywords)."&go=&qs=n&sk=&form=QBIR";

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		#curl_setopt($ch, CURLOPT_ENCODING , "gzip");
		$response_text = curl_exec($ch);
		curl_close($ch);
		
	$parts = explode('class="sg_u" m="', $response_text);
	array_shift($parts);
	$results = array();
	foreach($parts as $part){
		$part = explode('" id=', $part);
		$part = $part[0];
		$options = explode(',',$part);
		
		foreach($options as $option){

                        list($key, $value) = explode(":",$option, 2);
			

			if($key == 'height' or $key == 'width' or $key == 'turl' or $key == 'imgurl'){
				
				$replace = "\"";
				$value = str_replace($replace, "", $value);
				echo $value."<br>";
				switch($key){
					case 'height':
					
					break;

					case 'width':
					
					break;
					
					case 'turl':
					
					break;
					
					case 'imgurl':
					
					break;
					
					default:
					
					break;
					}
				}
		#	echo gettype($value);
		#	
		#	echo $option."<br>";
			}
		$results[] = $part;
		}

Zur Erklärung: Das betreffende HTML-Element auf der Website von Bing sieht folgendermaßen aus
HTML:
<span id="1022800167996" class="sg_u" m="{ms:"images,5139.1",height:"300",width:"239",turl:"http://ts1.mm.bing.net/images/thumbnail.aspx?q=1022800167996&id=e0244b6cdc8f854c171a0d6d6c1b1437&url=http%3a%2f%2fxn--sushi-nrnberg-2ob.de%2fsushi.jpg",imgurl:"http://xn--sushi-nrnberg-2ob.de/sushi.jpg",offset:"8",t:"Die beste Sushi-online in Nürnberg",w:"558",h:"700",ff:"jpeg",fs:"83",durl:"sushi-nürnberg.de",surl:"http://xn--sushi-nrnberg-2ob.de/",mid:"310EC249FA572E0769E6237704E25D0300621E02",k:"22",ns:"API.images"}">

mich interessieren die Daten die unter dem m-Attribut gespeichert sind. Mit Regulären Ausdrücken kam ich nicht weit, wobei ich auch zugeben muss, dass ich diese nur selten verwende und mich nicht sonderlich gut damit Auskenne.
In der Switch-Anweisung sind die Daten schon in Key-Value-Paare getrennt was soweit auch prima funktioniert, jetzt zum Problem. Ich bekomme beim besten willen die Anführungszeichen nicht aus dem $value String. Definiere ich manuell die $value beispielsweise als $value = ' "300" ', werden die Anführunszeichen korrekt entfernt, bei dem Text, den Curl liefert allerdings nicht. Kann es an dem Charset des Textes liegen und habt Ihr eine Idee wie sich das ändern lässt?

Grüße
 
Das war das erste was ich versucht hatte, nur funktioniert hats nicht. Ich poste morgen mal die genaue Fehlermeldung.
 
Äh - schau' dir doch bitte mal den Quelltext, den Bing ausliefert, genauer an... der sieht einfach nicht so aus, wie du es geschrieben hast.
 
Stimmt, der Übersicht halber habe ich nur den, für das Problem relevanten Abschnitt gepostet. Der gesamte HTML-Teil liegt im Quelltext in einer einzigen Zeile. Wenn du nach rechts scrollst solltest du fündig werden. Mit meinem Firefox werde ichs und curl liefert mir ja auch den richtigen Text als Ergebnis.

Wie dem auch sei, ich habe es gerade nochmal mit json_decode versucht, was mir NULL zurück liefert. Ich nehme an es liegt daran, dass die keys nicht in Anführungszeichen liegen!?
HTML:
{ms:"images,5139.1",height:"300",width:"239",turl:"http://ts1.mm.bing.net/images/thumbnail.aspx?q=1022800167996&id=e0244b6cdc8f854c171a0d6d6c1b1437&url=http%3a%2f%2fxn--sushi-nrnberg-2ob.de%2fsushi.jpg",imgurl:"http://xn--sushi-nrnberg-2ob.de/sushi.jpg",offset:"8",t:"Die beste Sushi-online in Nürnberg",w:"558",h:"700",ff:"jpeg",fs:"83",durl:"sushi-nürnberg.de",surl:"http://xn--sushi-nrnberg-2ob.de/",mid:"310EC249FA572E0769E6237704E25D0300621E02",k:"22",ns:"API.images"}
 
Jup, JSON braucht auch bei Keys die doppelten Anführungszeichen. Bei so etwas könntest du eval benutzen (aber zuerst filtern).
 
Wie wäre es die fehlenden Anführungszeichen zu ergänzen?
PHP:
$data = '{ms:"images,5139.1",height:"300",width:"239",turl:"http://ts1.mm.bing.net/images/thumbnail.aspx?q=1022800167996&id=e0244b6cdc8f854c171a0d6d6c1b1437&url=http%3a%2f%2fxn--sushi-nrnberg-2ob.de%2fsushi.jpg",imgurl:"http://xn--sushi-nrnberg-2ob.de/sushi.jpg",offset:"8",t:"Die beste Sushi-online in Nürnberg",w:"558",h:"700",ff:"jpeg",fs:"83",durl:"sushi-nürnberg.de",surl:"http://xn--sushi-nrnberg-2ob.de/",mid:"310EC249FA572E0769E6237704E25D0300621E02",k:"22",ns:"API.images"}';
//  $data = '{ms:"images,5139.1",height:"300",width:"239",turl:"http://ts1.mm.bing.net/images/thumbnail.aspx?q=1022800167996&id=e0244b6cdc8f854c171a0d6d6c1b1437&url=http%3a%2f%2fxn--sushi-nrnberg-2ob.de%2fsushi.jpg",imgurl:"http://xn--sushi-nrnberg-2ob.de/sushi.jpg",offset:"8",t:"Die beste Sushi-online in Nürnberg"}';
$erg = preg_replace('/([\{,])([a-z]+):\"/','$1"$2":"',$data);
$arr = json_decode($erg);
var_dump($arr);
 
Stimmt, der Übersicht halber habe ich nur den, für das Problem relevanten Abschnitt gepostet. Der gesamte HTML-Teil liegt im Quelltext in einer einzigen Zeile. Wenn du nach rechts scrollst solltest du fündig werden. Mit meinem Firefox werde ichs und curl liefert mir ja auch den richtigen Text als Ergebnis.
ist mir schon klar - der Quelltext sieht trotzdem anders aus! Bitte einmal GENAU hinsehen! Im m-Attribut befindet sich kein einziges Anführungszeichen!
 
Das Wars, ich hab den Quelltext meistens mit Firebug angesehen weil der ihn schön in Baumansicht darstellt. Allerdings ersetzt Firebug auch in der HTML Ansicht in den Attributen " durch ".

Dankeschön.
 
Hab da jetzt auch was anderes gesehen, dann muß er das halt zuvor durch html_entity_decode jagen...
 
Zurück
Oben