Autor Beitrag
Fabian W.
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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/.
ausblenden volle Höhe Quelltext
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 user profile iconKlabautermann: Topic aus Off Topic verschoben am Di 29.05.2007 um 17:22
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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... :roll:
= ist da schon richtig ;)
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 29.05.07 17:41 
du weißt aber schon, dass die function implode ein array erwartet:
PHP5 Das Buch hat folgendes geschrieben:
ausblenden 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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.. :cry:
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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:
ausblenden 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 107

Win 98, Win 2000 Prof., Win XP Prof.
Delphi 2005 Prof.
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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