php tut für c/c++ umsteiger



  • hab ich das richtig verstanden?:
    du willst wenn jemand einen linkt zu einen thread im forum macht, das der link dann den titel des topics hat?



  • ja



  • Dann müsstest du halt im Post nach der URL (hier: http://www.phpbb.com/phpBB/viewtopic.php)) suchen und anhand dessen die Topic-ID ermittel. Dann aus der DB den zugehörigen Titel auslesen und fertig 😉



  • Original erstellt von <phpbb'ler>:
    das ist doch easy, man muss nur die richtige stelle im code finden 😃 😃

    gefunden 🙂

    function make_clickable($text)
    {
        // ...
    }
    

    Original erstellt von flenders:
    Dann müsstest du halt im Post nach der URL (hier: http://www.phpbb.com/phpBB/viewtopic.php)) suchen und anhand dessen die Topic-ID ermittel. Dann aus der DB den zugehörigen Titel auslesen und fertig 😉

    danke für tipp
    wenn ich nicht weiter komme frage ich 🙂

    [ Dieser Beitrag wurde am 09.03.2003 um 18:43 Uhr von Dimah editiert. ]



  • also ich bin noch nicht ganz sicher bei Regex sachen, womit testet ihr?

    hat jemand ein tipp wieso

    "#(http://localhost/phpbb2/viewtopic.php?t=)(\d*)(\S*)#i"
    

    diese url nicht matcht
    http://localhost/phpbb2/viewtopic.php?t=3&start=0&postdays=0&postorder=asc&highlight=



  • So wie es aussieht verwendest du preg_match, oder? (also nicht ereg)
    Aber was sollen diese # an Anfang und Ende bedeuten, sowie das i ganz am Ende 😕

    [ Dieser Beitrag wurde am 09.03.2003 um 21:19 Uhr von flenders editiert. ]



  • Original erstellt von flenders:
    **So wie es aussieht verwendest du preg_match, oder? (also nicht ereg)
    Aber was sollen diese # an Anfang und Ende bedeuten, sowie das i ganz am Ende 😕
    **

    jup preg_match http://tut.php-q.net/regex.html

    das # ist der delimiter

    http://tut.php-q.net/regex.html#u2
    Der Delimiter gibt das Trennzeichen an von der der Regex von den Modifiers getrennt werden. Dieses Trennzeichen muss ein nicht Alphanumerisches-Zeichen sein, darf also kein Buchstabe und keine Zahl sein. Man benutzt z.B. die Zeichen # und die in Perl üblichen zeichen /. Man sollte ein Delimiter wählen, den man nicht im Regex benutzt, da man sonst dieses Zeichen im eigentlichem Regex escapen muss.

    i (case-insensitiv)ist ein modifizierer http://tut.php-q.net/regex.html#u5

    Delimiter + Regex + Delimiter [+ Modifiers]
    

    soll ich die ereg regexp nutzen?

    [ Dieser Beitrag wurde am 09.03.2003 um 22:05 Uhr von Dimah editiert. ]



  • nein ereg ist veraltet und langsam



  • habe es jetzt getryt & geerrort
    habe die zwei | vergessen

    '#http://localhost/phpbb2/viewtopic.php?t=|\d*|\S*#i'
    

    und ich musste statt "" '' benutzen da in "" \ zum escapen benutzen wird

    [ Dieser Beitrag wurde am 09.03.2003 um 22:27 Uhr von Dimah editiert. ]



  • Ich hatte statt # bisher immer / gesehen 😉
    Die Klammern brauchst du aber doch, um die einzelnen teil-matches zu bekommen! Jetzt hast du ja ein or, oder? 🙄

    [ Dieser Beitrag wurde am 10.03.2003 um 13:15 Uhr von flenders editiert. ]



  • jup bin von einen fehler in nähsten gestolpert

    zu zeit habe ich jetzt diesen

    #(\s)(http://localhost/phpbb2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)#i
    

    jetzt kann ich die zahl extrahieren, nur wie bringe ich den topic titel wieder rein?
    also ich könnte ne funktion schreib

    function gettopictitel($id);
    
    $ret = preg_replace("#(\s)(http://localhost/phpbb2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)#i", 
                '\1<a href="\2\3\4" target="_blank">' . gettopictitel('\3') . '</a>', $ret);
    

    das geht ja schlecht, wie macht man sowas?



  • du machst eine function:

    function getTopic($x)
    {
       $topic holen
       ... ...
       return $topic
    }
    

    und rufst die so auf:

    $ret = preg_replace("#(\s)(http://localhost/phpbb2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)#i", 
                '\1<a href="\2\3\4" target="_blank">' . getTopic('\3') . '</a>', $ret);
    

    fertig



  • danke
    ziemlich flexiebel dieses php

    [ Dieser Beitrag wurde am 10.03.2003 um 14:32 Uhr von Dimah editiert. ]



  • sicher das es so geht? ich glaube nicht, in der funktion ist $x immer noch '\3'



  • ja 100%ig. übrigens mit deinen regex wirst du nichts matchen hier der funktioniert:

    $ret = preg_replace("#[url](http://localhost/phpBB2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)[/url]#i", 
                '<a href="\2\3\4" target="_blank">' . gettopictitel('\2') . '</a>', $ret);
    


  • übrigens: das '\2' wird durch die topic id ersetzt (falls du es noch nicht weißt). jetzt muss du nurnoch den titel aus der db holen und fertig




  • da wird '\2' an gettopictitel übergeben, das ergebnis von gettopictitel wir mit den rest string verknüpft und an preg_replace übergeben.
    und erst in der funktion wird '\2' (eigentlich '\3') duch die id ersetzt



  • nein, das geht nicht. du musst den umweg mit preg_match machen.
    hier der fertige code:
    make_clickable()

    //matches ?t=xxx
        if (preg_match("#[url](http://localhost/phpBB2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)[/url]#i", $ret,$matches))
        {
    
            $ret = preg_replace("#[url](http://localhost/phpBB2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)[/url]#i", 
                "<a href=".$matches[1].$matches[2].$matches[3].">".gettopictitel($matches[2])."</a>", $ret);
        }
    

    gettopictitel:

    $phpbb_root_path = "../";  // da event. anpassen
        include $phpbb_root_path."extension.inc";
        include $phpbb_root_path."config.".$phpEx;
        include $phpbb_root_path."includes/db.".$phpEx;
    
        $sql = "SELECT topic_title
                FROM " . TOPICS_TABLE . " t
                WHERE topic_id = '$x'";
            if ( !($result = $db->sql_query($sql)) )
            {
                message_die(GENERAL_ERROR, "Could not get title information", '', __LINE__, __FILE__, $sql);
            }
            $titel = $db->sql_fetchfield(0,0);
    
         return $titel;
    

    gruß
    Michi

    [ Dieser Beitrag wurde am 10.03.2003 um 17:44 Uhr von Michi_M editiert. ]

    [ Dieser Beitrag wurde am 10.03.2003 um 17:44 Uhr von Michi_M editiert. ]



  • Danke,
    habe mich schon gefagt woher das db kommt

    du schreibst

    $sql = "SELECT topic_title FROM " . TOPICS_TABLE . " t WHERE topic_id = '$x'";
    

    sollte das nicht ehr

    $sql = "SELECT topic_title FROM " . TOPICS_TABLE . " t WHERE topic_id = " . $x;
    

    ?

    und ich krige aus der zeile

    if ( !($result = $db->sql_query($sql)) )
    
    Fatal error: Call to a member function on a non-object in C:\WAMP\Root\phpBB2\includes\bbcode.php on line 623
    

    hilfe



  • 1. Wenn du in PHP "" verwendest kannst du Variablen-Namen darin direkt verwenden, also z.B. echo "Name: $name";
    Außerdem würde ich für die DB-Abfrage den Inhalt schon in '' einschließen - ist sicherer
    2. Er hat sich wohl ein DB-Objekt erstellt 😉


Anmelden zum Antworten