php tut für c/c++ umsteiger



  • 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 😉



  • hast du die include in der gettopictitel function?

    function gettopictitel($x)
     {
        $phpbb_root_path = "c:\\www\\phpBB2\\";
        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 . " 
                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;
     }
    

    die sql query kann man auch wie du machen, kommt aber das selbe raus.
    🙄

    [ Dieser Beitrag wurde am 10.03.2003 um 19:49 Uhr von Michi_M editiert. ]



  • *grussel* includes in funktionen
    naja wenn ich die includes in die funktion mache dann krige ich die

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 27 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 32 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: Cannot modify header information - headers already sent by (output started at C:\WAMP\Root\phpBB2\db\mysql4.php:259) in C:\WAMP\Root\phpBB2\includes\page_header.php on line 460

    Warning: Cannot modify header information - headers already sent by (output started at C:\WAMP\Root\phpBB2\db\mysql4.php:259) in C:\WAMP\Root\phpBB2\includes\page_header.php on line 466

    Warning: Cannot modify header information - headers already sent by (output started at C:\WAMP\Root\phpBB2\db\mysql4.php:259) in C:\WAMP\Root\phpBB2\includes\page_header.php on line 467

    und

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 48 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 53 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 58 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 63 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 68 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259

    Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 73 in C:\WAMP\Root\phpBB2\db\mysql4.php on line 259



  • ich habs mal verbessert:

    unter

    if ( !defined('IN_PHPBB') )
    {
        die("Hacking attempt");
    }
    

    das:

    $phpbb_root_path = "c:\\www\\phpBB2\\";
    include $phpbb_root_path."extension.inc";
    include $phpbb_root_path."config.".$phpEx;
    include $phpbb_root_path."includes/db.".$phpEx;
    

    dann die gettopictitel:

    function gettopictitel($x)
     {
        global $db;
    
        $sql = "SELECT topic_title
                FROM " . TOPICS_TABLE . " 
                WHERE topic_id = '$x'";
            if ( !($result = $db->sql_query($sql)) )
            {
    
                message_die(GENERAL_ERROR, "Could not obtain newer/older topic information", '', __LINE__, __FILE__, $sql);
            }
            $titel = $db->sql_fetchrow();
    
         return $titel[0];
     }
    

    Gruß
    Michi



  • jupie mein erster mod, danke Michi_M & flenders ohne euch wäre das nicht möglich

    //unter 
    
    if ( !defined('IN_PHPBB') )
    {
        die("Hacking attempt");
    }
    
    //das:
    
    $phpbb_root_path = "./"; // <- anpassen
    include $phpbb_root_path."extension.inc";
    include $phpbb_root_path."config.".$phpEx;
    include $phpbb_root_path."includes/db.".$phpEx;
    
    // über
    
    function make_clickable($text)
    {
    
        // pad it with a space so we can match things at the start of the 1st line.
        $ret = ' ' . $text;
    
    // das
    
    function get_topic_titel($x)
    {
        global $db;
    
        $sql = "SELECT topic_title FROM " . TOPICS_TABLE . " WHERE topic_id = '$x'";
    
        if ( !($result = $db->sql_query($sql)) )
        {
            message_die(GENERAL_ERROR, "Could not obtain newer/older topic information", '', __LINE__, __FILE__, $sql);
        }
        $titel = $db->sql_fetchrow();
    
        return $titel['topic_title'];
    }
    
    function raw_topic_url_to_url_with_topic_titel($mat)
    {
        return $mat[1]."<a href=\"".$mat[2].$mat[3].$mat[4]."\" target=\"_blank\">".get_topic_titel($mat[3])."</a>";
    }
    
    // unter
    
    function make_clickable($text)
    {
    
        // pad it with a space so we can match things at the start of the 1st line.
        $ret = ' ' . $text;
    
    // das
    
        $ret = preg_replace_callback
        (
            "#(\s)(http://localhost/phpbb2/viewtopic\.php\?t=)(\d*)(\S*)([^ \"\n\r\t<]*)#i", 
            'raw_topic_url_to_url_with_topic_titel', 
            $ret 
        );
        // hier müsste man den pattern an sein Forum anpassen
        // ich muss mal kucken obs eine konstante gibt die es erleichtern würde
    

Anmelden zum Antworten