jobo: string bei ? abschneiden, wenn vorhanden

Hallo,

"example.com/blabla.php?abc=def" soll am Fragezeichen abgeschnitten werden, falls vorhanden. Gibts hier dran was zu optimieren?

  
<?=($pos = strpos(($link = $rezensionenCurrentRow["Link2"]),"?")) ? substr($link,0,$pos) : $link;?>  

Abgesehen von den short-open-tags? hab da immanent ja gleich zwei vars mit defniniert ($pos und $link), damits dann in der folge kürzer wird.

Gruß

jobo

  1. Hallo,

    Gibts hier dran was zu optimieren?

    Ja. Du möchtest die Funktion parse_url() benutzen.

    Grüße

    1. Hallo,

      Hallo,

      Gibts hier dran was zu optimieren?
      Ja. Du möchtest die Funktion parse_url() benutzen.

      Danke. Spontaner Nachteil:

        
      $url1 = "example.com/abc.php?a=b";  
      var_dump(parse_url($url1));  
      /*  
      array(2) {  
        ["path"]=>  
        string(19) "example.com/abc.php"  
        ["query"]=>  
        string(3) "a=b"  
      }  
      */  
      $url1 = "http://example.com/abc.php?a=b";  
      var_dump(parse_url($url1));  
      /*  
      array(4) {  
        ["scheme"]=>  
        string(4) "http"  
        ["host"]=>  
        string(11) "example.com"  
        ["path"]=>  
        string(8) "/abc.php"  
        ["query"]=>  
        string(3) "a=b"  
      }  
      */  
      
      

      also einmal der Domainteil in "path", einmal in "host". Aber das lässt sich ja u.U. kontrollieren.

      Grüße

      Gruß

      jobo

      1. Hallo

        Gibts hier dran was zu optimieren?
        Ja. Du möchtest die Funktion parse_url() benutzen.

        Danke. Spontaner Nachteil:

        $url1 = "example.com/abc.php?a=b";
        var_dump(parse_url($url1));
        /*
        array(2) {
          ["path"]=>
          string(19) "example.com/abc.php"
          ["query"]=>
          string(3) "a=b"
        }
        /
        $url1 = "http://example.com/abc.php?a=b";
        var_dump(parse_url($url1));
        /

        array(4) {
          ["scheme"]=>
          string(4) "http"
          ["host"]=>
          string(11) "example.com"
          ["path"]=>
          string(8) "/abc.php"
          ["query"]=>
          string(3) "a=b"
        }
        */

        
        >   
        > also einmal der Domainteil in "path", einmal in "host". Aber das lässt sich ja u.U. kontrollieren.  
          
        Das ist kein Nachteil, sondern ein Missverständnis. "example.com/abc.php?a=b" ist keine vollständige URL, da fehlt das Protokoll. Deshalb wird der für dich als Domainname erkennbare Teil von der Funktion als Pfadbestandteil eingeordnet.  
          
        Tschö, Auge  
        
        -- 
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
        Terry Pratchett, "Wachen! Wachen!"  
          
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}  
          
        [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
        
        1. Das ist kein Nachteil, sondern ein Missverständnis. "example.com/abc.php?a=b" ist keine vollständige URL, da fehlt das Protokoll.

          Sicher ist das ein vollständiger URL - zwar kein HTTP-URL wie er lt. RFC 1738 definiert ist, aber dennoch syntaktisch völlig einwandfrei.

          In jedem Fall ist es aber ein sauber defniierter, vollständiger URI - siehe RFC 3986, Abschnitt 4.2

          1. Hi!

            Das ist kein Nachteil, sondern ein Missverständnis. "example.com/abc.php?a=b" ist keine vollständige URL, da fehlt das Protokoll.
            Sicher ist das ein vollständiger URL - zwar kein HTTP-URL wie er lt. RFC 1738 definiert ist, aber dennoch syntaktisch völlig einwandfrei.

            Du hast ja so recht, aber das hilft in dem Fall nicht weiter. Denn laut Handbuch-Note: "This function doesn't work with relative URLs." Um richtig zu arbeiten braucht die Funktion eine absolute URL. "Vollständig" ist hier als "absolute" gemeint zu lesen.

            In jedem Fall ist es aber ein sauber defniierter, vollständiger URI - siehe RFC 3986, Abschnitt 4.2

            "This function is intended specifically for the purpose of parsing URLs and not URIs."

            Lo!

            1. "This function is intended specifically for the purpose of parsing URLs and not URIs."

              Natürlich - aber auch das macht sie nicht richtig

              http://foo:bar@www.example.com/ ist ungültig, wird aber trotzdem zerlegt - die Funktion scheint sämtliche URLs einfach nach der generischen Funktion zu behandeln und nicht schemaspezifisch.

              1. Hi,

                "This function is intended specifically for the purpose of parsing URLs and not URIs."

                Natürlich - aber auch das macht sie nicht richtig

                http://foo:bar@www.example.com/ ist ungültig, wird aber trotzdem zerlegt

                Natürlich macht sie das - das ist ja auch das, was der Durchschnittsnutzer von ihr erwartet.
                Ob dieses Schema einen korrekten HTTP-URL darstellt, ist dem doch egal.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. Um den Querystring zu zerlegen, gibt es übrigens parse_str() - nicht dass du da mit explode rangehst.

        Und natürlich gibts auch $_GET - sofern es dir nicht darum geht Benutzereingaben zu zerlegen.

        Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

        1. Hallo,

          Um den Querystring zu zerlegen, gibt es übrigens parse_str() - nicht dass du da mit explode rangehst.

          Und natürlich gibts auch $_GET - sofern es dir nicht darum geht Benutzereingaben zu zerlegen.

          Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

          Gibt aber leider den Rest des Strings zurück. Die Strings stammen aus einer Tabelle, sind also Admin-Eingaben. Da steht u.U. example.com bzw. normalerweise, und wird dann in den Link eingebaut mit PHP. Jetzt war ein Link aber example.com/?search=bla%20blubb%20undnocheinigesmehr. Da sollte halt in der Anzeige des Links der Querystring wech, also im Textknoten. Deshalb hats mit $_GET nix zu tun und das http:// fehlt natürlich auch, weil überflüssig in der Tabelle. Das wird dann im PHP-Skript vorangestellt.

          Gruß

          jobo

          1. Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

            Gibt aber leider den Rest des Strings zurück.

            Doku lesen - strstr() erwartet mehrere Argumente ;)

            1. Hallo,

              Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

              Gibt aber leider den Rest des Strings zurück.

              Doku lesen - strstr() erwartet mehrere Argumente ;)

              wie true:

                
              <?php  
              $email  = 'name@example.com';  
              $domain = strstr($email, '@');  
              echo $domain; // Ausgabe: @example.com  
                
              $user = strstr($email, '@', true); // Ab PHP 5.3.0  
              echo $user; // Ausgabe: name  
              ?>  
              
              

              Gruß

              jobo

        2. Hallo,

          Um den Querystring zu zerlegen, gibt es übrigens parse_str() - nicht dass du da mit explode rangehst.

          Und natürlich gibts auch $_GET - sofern es dir nicht darum geht Benutzereingaben zu zerlegen.

          Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

            
          <?= ($url = strstr( ($link = $rezensionenCurrentRow["Link2"]) ,"?",true)) ? $url : $link;?>  
          
          

          Gruß

          jobo

        3. Hello,

          Um den Querystring zu zerlegen, gibt es übrigens parse_str() - nicht dass du da mit explode rangehst.

          Und natürlich gibts auch $_GET - sofern es dir nicht darum geht Benutzereingaben zu zerlegen.

          Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

          Bytefolgen an einem bestimmten Bytewert...

          um das mal wieder in Erinnerung zu bringen :-P

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

            Bytefolgen an einem bestimmten Bytewert...

            um das mal wieder in Erinnerung zu bringen :-P

            Jaja - du hast ja recht :) du hättest aber gleich bei dieser gelegenheit mb_strstr() erwähnen können.

            1. Hello,

              Strings an einem bestimmten Zeichen abschneiden geht übrigens mit strstr() ganz ohne substr() und strpos()

              Bytefolgen an einem bestimmten Bytewert...

              um das mal wieder in Erinnerung zu bringen :-P

              Jaja - du hast ja recht :) du hättest aber gleich bei dieser gelegenheit mb_strstr() erwähnen können.

              Ok, mach ich:

              strstr() ist nur für Bytefolgen brauchbar, also für eine spezielle Gruppe von Strings, nämlich die singlebyte-codierten.
              http://de2.php.net/manual/en/function.strstr.php

              mb_strstr() kann auch multibyte-codierte Strings verarbeiten.
              http://de2.php.net/manual/en/function.mb-strstr.php

              Ist es jetzt so besser? ;-P

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
      3. Hi,

        Du möchtest die Funktion parse_url() benutzen.
        Danke. Spontaner Nachteil:

        $url1 = "example.com/abc.php?a=b";

        var_dump(parse_url($url1));
        /*
        array(2) {
          ["path"]=>
          string(19) "example.com/abc.php"
          ["query"]=>
          string(3) "a=b"
        }
        /
        $url1 = "http://example.com/abc.php?a=b";
        var_dump(parse_url($url1));
        /

        array(4) {
          ["scheme"]=>
          string(4) "http"
          ["host"]=>
          string(11) "example.com"
          ["path"]=>
          string(8) "/abc.php"
          ["query"]=>
          string(3) "a=b"
        }
        */

        
        >   
        > also einmal der Domainteil in "path", einmal in "host".  
          
        das liegt daran, dass du im Fall 1 keine ordentliche URL-Angabe hast. Wenn die Protokollangabe und die führenden // fehlen, kann parse\_url() nicht ahnen, dass example.com der Hostname sein soll, und geht stattdessen von einer relativen URL aus. Die Felder scheme und host im Ergebnis-Array bleiben folgerichtig leer.  
          
        
        > Aber das lässt sich ja u.U. kontrollieren.  
          
        Indem man URLs ordentlich schreibt, ja.  
          
        Ciao,  
         Martin  
        
        -- 
        Ein Snob ist ein Mensch, der sich auf ein Stachelschwein setzt, ohne eine Miene zu verziehen - nur weil ihm jemand gesagt hat, das sei ein Designersessel.  
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        
        1. Auch eine relative URL kann zutreffend und valide, wenn doch nicht vollständig sein.

          Gruß, LX

          --
          RFC 5984, Satz 7 (Security Considerations) (...) Terroristische Organisationen könnten die "Schlechte Nachrichten verbreiten sich schneller"-Schwachstelle aus RFC 1216 ausnutzen.