Autor |
Beitrag |
Fabian W.
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 29.05.07 16:59
Tja, ich hab die Frage nun auch schon in nem PHP-Forum gestellt und ne Mail an den Entwickler geschrieben - leider keine Antworten. So probier ichs mal hier
phpforum.de/forum/showthread.php?t=201349 Das ist das besagte Topic - ich poste es hier auch nochmal:
Um Trackback in meinem Blog zu realisieren habe ich mir mal diese Klasse runtergeladen: phptrackback.sourceforge.net/.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| function auto_discovery($text) { // Get a list of UNIQUE links from text... // --------------------------------------- // RegExp to look for (0=>link, 4=>host in 'replace') $reg_exp = "/(http)+(s)?:(\\/\\/)((\\w|\\.)+)(\\/)?(\\S+)?/i"; // Make sure each link ends with [sapce] $text = eregi_replace("www.", "http://www.", $text); $text = eregi_replace("http://http://", "http://", $text); $text = eregi_replace("\"", " \"", $text); $text = eregi_replace("'", " '", $text); $text = eregi_replace(">", " >", $text); $text = eregi_replace("]", " ]", $text); //lauter gescheiterte versuche die zeilenumbrüche zu ersetzen //$text = ereg_replace('<br>', ' ', $text); //$text = eregi_replace("(\r\n|\n|\r)", '_bla_', $text); //$text = preg_replace("/[\n]/", '', $text); //$text = preg_replace("/(\r?\n)/Us",":newline:",$text); echo($text); // DEBUG 1 // Create an array with unique links $uri_array = array(); if (preg_match_all($reg_exp, strip_tags($text, "<a>"), $array, PREG_PATTERN_ORDER)) { foreach($array[0] as $key => $link) { foreach((array(",", ".", ":", ";")) as $t_key => $t_value) { $link = trim($link, $t_value); } $uri_array[] = ($link); } $uri_array = array_unique($uri_array); } // Get the trackback URIs from those links... // ------------------------------------------ // Loop through the URIs array and extract RDF segments $rdf_array = array(); // <- holds list of RDF segments foreach($uri_array as $key => $link) { dumparray($uri_array); //DEBUG 2 if ($link_content = implode("", @file($link))) { preg_match_all('/(<rdf:RDF.*?<\/rdf:RDF>)/sm', $link_content, $link_rdf, PREG_SET_ORDER); for ($i = 0; $i < count($link_rdf); $i++) { if (preg_match('|dc:identifier="' . preg_quote($link) . '"|ms', $link_rdf[$i][1])) { $rdf_array[] = trim($link_rdf[$i][1]); } } } } // Loop through the RDFs array and extract trackback URIs $tb_array = array(); // <- holds list of trackback URIs if (!empty($rdf_array)) { for ($i = 0; $i < count($rdf_array); $i++) { if (preg_match('/trackback:ping="([^"]+)"/', $rdf_array[$i], $array)) { $tb_array[] = trim($array[1]); } } } // Return Trackbacks return $tb_array; } |
Zitat: | "Warning: implode() [function.implode]: Bad arguments. in trackback_cls.php on line 368" |
Der Fehler liegt meiner Meinung nach daran: Wie oben commentiert wird davon ausgegangen dass alle urls mit einem space enden - folgt aber ein zeilenumbruch direkt auf einen url ist das ja kein leerzeichen. Somit wird der gesamte Text bis zum nächsten space als Link übernommen und file() gibt natürlich nen Fehler aus.
Die Tatsache dass auch ein Fehler kommen würde, wenn ein user einen nicht existierenden Link angibt, lassen wir mal ausser Acht, das ist mir bekannt.
Ich habe jetzt also Versucht die zeilenumbrüche zu ersetzten, allerdings ohne Erfolg - sie werden durch keine der kommentierten Metjoden ersetzt - was ich an 2 stellen überprüfe (DEBUG 1 und 2).
Hat jm von euch eine Idee wo mein Fehler ist, bzw ob es vlt an etwas ganz anderen liegt? Moderiert von Klabautermann: Topic aus Off Topic verschoben am Di 29.05.2007 um 17:22
|
|
freak4fun
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Di 29.05.07 17:07
Benutzt man bei php nit "=="?
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Fabian W.
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 29.05.07 17:18
Ja natürlich, in der Zeile wird ja auch überprüft ob eine Zuweißung des Wertes von implode() auf die variable geglückt ist - deshalb verstehe ich auch die Fehlermeldung nicht ganz, weil normalerweise an der Stelle keine auftreten dürfte - egal ob einer passiert oder nicht. Genau davon hängt da die Ausführung des If-Teils ab...
= ist da schon richtig
|
|
Regan
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Di 29.05.07 17:41
du weißt aber schon, dass die function implode ein array erwartet: PHP5 Das Buch hat folgendes geschrieben: | PHP 1:
| string [b]implode[/b] (string glue, array pieces) | Mit implode() fügt man ein Array (pieces) anhand eines Trennzeichens (glue) zu einem String zusammen. Dabei werden die Array-Elemente nacheinander an den String angehängt. |
Zuletzt bearbeitet von Regan am Di 29.05.07 17:46, insgesamt 2-mal bearbeitet
|
|
Fabian W.
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 29.05.07 17:45
jau: Zitat: | Die Funktion file() ist identisch mit readfile(), außer dass die eingelesene Datei als Array zurückgegeben wird. Jedes Feld des Arrays korrespondiert mit einer Zeile der Datei. Der Zeilenumbruch bleibt erhalten. Im Fehlerfall gibt file() FALSE zurück. |
Mein Problem ist glaube ich einfach nur die zeilenumbrüche durch leerzeichen zu ersetzen - im Code sind ja eineige gescheiterte Versuche kommentiert..
|
|
Regan
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Di 29.05.07 17:51
dann versuch doch mal, erst einer variable diese file(...) zuzuweisen und schau da mal, ob dort der fehler liegt: PHP 1: 2: 3: 4:
| ... $dastemporaerdings=file($link); if ($link_content == implode("", $dastemporaerdings)) { ... |
Zuletzt bearbeitet von Regan am Di 29.05.07 18:11, insgesamt 1-mal bearbeitet
|
|
Fabian W.
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 29.05.07 17:55
Nun ja - ich gebe die URL die später in file() eingesetzt werden ja vorher schonmal mit dumparray aus - und dabei habe ich auch festgestellt dass zeilenumbrüche eben als /r/n stehen bleiben.
Schreibe ich im Text hinter jede URl schön mein Leerzeichen kommt auch kein Fehler.
|
|
Pepe
Beiträge: 107
Win 98, Win 2000 Prof., Win XP Prof.
Delphi 2005 Prof.
|
Verfasst: Di 29.05.07 17:57
Wenn du wirklich nur das willst, warum dann der umweg über nen array?
regel das einfach so: $ausgabe = str_replace("\n","",$file_text);
und wenn implode für leerzeichen, dann implode(" ",$array); und wie schon gesagt, in der if abfrage nen ==
überprüfen, ob der wert übergeben wurde kannst du mit empty() und isset()
Zuletzt bearbeitet von Pepe am Di 29.05.07 18:02, insgesamt 1-mal bearbeitet
|
|
Fabian W.
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 29.05.07 18:02
Um erstema klar zu stellen - die Funktion ist nicht von mir sondern ist in der o.g. Klasse enthalten.
Ich weiß jetzt nicht welches array du meinst - das uri_array enthält vor dem markieren Abschnitt alle links die in einem Text (Blogeintrag) vorkommen.
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 29.05.07 18:43
Ich soll von Fabian ausrichten, dass das Problem gelöst ist und er die entsprechende Lösung noch posten wird. Er hat gerade keine Zeit, aber es muss sich keiner mehr den Kopf zerbrechen
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Fabian W.
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 29.05.07 20:59
Jau, war etwas im Stress wegen Fahrschule, danke Christian.
Also Christion hat mich dann durch nen kleinen Test auf die Lösung gebracht: Die Klasse an sich ist eigentlich gar nicht schuld, der Fehler tritt auf sobald man den Text vorher für ne SQL-Datenbank vorbereitet (mit mysql_real_escape_string();). Genau das hatte ich gemacht und bin nicht auf den Gedanken gekommen, dass das was ausmacht.
Fazit: Das Teil läuft fehlerfrei, wenn man nicht grade mysql_real_escape_string(); vorher aufruft^^
Für die jenigen, die es interesiert ob die Funktion dann auch tatsächlich das macht was sie verspricht (Trackbacks versenden) werde ich bald nochma nen kleinen Post anhängen, zumindest kommen jetzt keine Fehler mehr
mfg und allen Beteiligten nochmal Danke für die schnelle Hilfe
|
|
|