Jo: Den <title> einer anderen Seite auslesen

Hey,

ich möchte gerne wenn mir jemand den Link "http://forum.de.selfhtml.org/hilfe/charta.htm" gibt, der <title>-Tag ausgelesen wird.

Geht sowas?

Gruß,

Jo

  1. Moin Moin!

    ich möchte gerne wenn mir jemand den Link "http://forum.de.selfhtml.org/hilfe/charta.htm" gibt,

    Das ist kein Link, das ist eine URL.

    der <title>-Tag ausgelesen wird.

    Geht sowas?

    Ja. Zum Beispiel, indem Du die Seite im Browser öffnest, die "View Source"/"Quelltext anzeigen"-Funktion aufrufst (beim FF z.B. mit Ctrl-U), und dann die Suchfunktion benutzt (beim FF Ctrl-F), um nach "<title" zu suchen.

    Was hast Du bisher probiert?

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Nicht dein Ernst oder?

      Danke für diese Sinnfreie Antwort.

  2. Hello,

    ich möchte gerne wenn mir jemand den Link "http://forum.de.selfhtml.org/hilfe/charta.htm" gibt, der <title>-Tag ausgelesen wird.

    Geht sowas?

    Wenn dein Webserver für PHP die Erlaubnis hat, auf URLs mit den Dateifunktionen zuzugreifen, dann geht das relativ einfach. Dazu muss der Schalter 'allow_url_fopen' in der Konfiguration auf ON stehen.

    Du holst Dir dann z.B. die ganze Ressource in den Speicher

    $fremde_seite = file_get_contents("http://forum.de.selfhtml.org/hilfe/charta.htm");

    if ($fremde_seite !== false)
        {
            $pos1 = nach_dem_start_suchen($fremde_seite,'<title>');
            $pos2 = nach_dem_ende_suchen($fremde_seite'</title>');

    $titel = text_zwischen_start_und_ende_ausschneiden($fremde_seite, $pos1+7, $pos2-$pos1);
        }

    Die beiden tatsächlichen Funktionen, die Du anstelle meiner Pseudofunktionen einsetzen musst, findest Du unter

    http://de3.php.net/manual/en/ref.strings.php

    Denk dran, dass in manchen Dokumenten auch "<TITLE>" steht...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Danke dir.

      Und in wiefern ist 'allow_url_fopen' eine Sicherheitslücke?
      WOrauf muss ich da achten?

      Gruß,

      Jo

      1. Tach,

        Und in wiefern ist 'allow_url_fopen' eine Sicherheitslücke?
        WOrauf muss ich da achten?

        überall, wo du PHP eine Datei übergibst (z.B. include, require), kann jetzt auch eine URL übergeben werden. Im schlimsmten Fall baust du dir eine Remote-Code-Execution-Lücke.

        mfg
        Woodfighter

        1. Hello,

          Und in wiefern ist 'allow_url_fopen' eine Sicherheitslücke?
          WOrauf muss ich da achten?

          überall, wo du PHP eine Datei übergibst (z.B. include, require), kann jetzt auch eine URL übergeben werden. Im schlimsmten Fall baust du dir eine Remote-Code-Execution-Lücke.

          *äh*
          ist das bei include und require nicht inzwischen der Schalter 'allow_url_include'?

          http://de3.php.net/manual/de/filesystem.configuration.php#ini.allow-url-fopen

          http://de3.php.net/manual/de/filesystem.configuration.php#ini.allow-url-include

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Tach,

            überall, wo du PHP eine Datei übergibst (z.B. include, require), kann jetzt auch eine URL übergeben werden. Im schlimsmten Fall baust du dir eine Remote-Code-Execution-Lücke.

            ist das bei include und require nicht inzwischen der Schalter 'allow_url_include'?

            oh, es sind wohl beide nötig für include; auch wenn ich das nur in den Kommentaren von include erwähnt wird.

            mfg
            Woodfighter

    2. Sieht dann so aus:

      # Position 1  
      if(!$pos1=stripos($page, "<title>")){  
        return false;  
      }  
      		  
      # Position 2  
      if(!$pos2=stripos($page, "</title>")){  
        return false;  
      }  
      		  
      # Titel auslesen  
      $title=substr($page,$pos1+7,$pos2-$pos1);
      

      =)

      1. Hello,

        Sieht dann so aus:

        ist fast richtig

        Position 1

        function get_title($page)
        {

        #> if(!$pos1=stripos($page, "<title>")){
          if(false!==($pos1=stripos($page, "<title>")))
          {

        return false;
        }

        Position 2

        if(false!==(!$pos2=stripos($page, "</title>")))

        {

        return false;
        }

        if ($pos1 > $pos2) return false;

        Titel auslesen

        $title = substr($page,$pos1+7,$pos2-$pos1);

        return $title;
        }

        stripos() liefert 0, wenn der String ganz am Anfang erkannt wurde.
        bei einem einfachen Vergleich == mit false würde bei PHP auch 0 == false sein
        Wenn die Stringsuche aber tatsächlich false zurückliefert, dann kannst Du das mit dem Identitätsvergleich "false === stripos()" abfragen. Nur dann wurde kein String gefunden.

        Das "return false" hat natürlich nur einen Sinn, wenn Du es in einer Funktion aufrufst.

        Wenn es ganz gut werden soll, dann musst Du natürlich auch noch feststellen, ob $pos1 < $pos2 ist. Wer weiß schon, was der HTML-Künstler der fremden $page da zusammengeschreiben hat.

        Wie man sieht, geht es beim <title>-Tag ganz ohne Regulat Expressions, weil der i.d.R. ohne Attribute steht, die gesuchten Zeichenketten damit also genau bekannt sind.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          function get_title($page)
          {

          #> if(!$pos1=stripos($page, "<title>")){

          if(false === ($pos1 = stripos($page, "<title>")))

          {

          return false;
          }

          Position 2

          if(false === ($pos2 = stripos($page, "</title>")))

          {

          return false;
          }

          if ($pos1 > $pos2) return false;

          Titel auslesen

          $title = substr($page,$pos1+7,$pos2-$pos1);

          return $title;
          }

          Dass das verkehrt herum war, wirst Du schon gmerkt haben, oder? :-)

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
        2. n'abend,

          ist fast richtig

          [...]

          if(false!==($pos1=stripos($page, "<title>")))

          Knapp am Ziel vorbei ist halt immer noch daneben.

          Auch <title> kann Attribute haben. Diese unterschlägt die stripos() Lösung vollkommen. Im Konkreten können <title> mit den Attributen dir und lang ausgestattet werden.

          Wie man sieht, geht es beim <title>-Tag ganz ohne Regulat Expressions, weil der i.d.R. ohne Attribute steht, die gesuchten Zeichenketten damit also genau bekannt sind.

          "i.d.R" bedeutet halt leider nicht "ist so, punkt.". Wenn du Lösungen vorschlägst, dann bitte welche, die allgemeingültig und korrekt sind. Du hast hier eine "lehrende Position" eingenommen, verhalte dich entsprechend.

          Wenn du aber wehement auf RegEx verzichten möchtest:

          1. Suche nach "<title", ignoriere Groß-/Kleinschreibung.
          2. Taste dich weiter bis zum nächsten ">", damit wird der öffnende Tag geschlossen.
          3. Merke dir die gefundene Position als "start".
          4. Laufe weiter um "</title>" zu finden, ignoriere Groß-/Kleinschreibung.
          5. Schneide Text zwischen start und ende aus, du hast deinen Titel.

          Das sieht nach mächtig viel Code für nichts und wieder nichts aus.
          RegExp: /<title[^>]*?>(.*?)</title>/i
          Mit preg_match() wird das ganze zum Dreizeiler.

          Neben dem "manuellen" Stringgedöns könntest du den geladenen HTML-Source übrigens mit DOMDocument::loadHTML() parsen lassen. Wenn du auf dem geladenen Dokument mehr machen musst, als den <title> auszulesen, kann das recht schnell, recht sinnvoll werden.

          weiterhin schönen abend...

          --
          #selfhtml hat ein Forum?
          sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
          1. Hello,

            "i.d.R" bedeutet halt leider nicht "ist so, punkt.". Wenn du Lösungen vorschlägst, dann bitte welche, die allgemeingültig und korrekt sind. Du hast hier eine "lehrende Position" eingenommen, verhalte dich entsprechend.

            Na, ich muss ja noch 'was für Dich übrig lassen. Sonst sieht das nachher so aus, als wolle ich selber nichts mehr lernen und das stimmt ja nun ganz und gar nicht. :-P

            Aus dem 'i.d.R.' wirst Du ja schon entnommen haben, dass ich sehr wohl darüber nachgedacht habe.
            Ob es nun gut ist, jemandem, der selber noch nicht mit den Stringfunktionen vertraut ist, gleich einen Vollkurs zu verpassen, das bezweifele ich.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. n'abend,

              Na, ich muss ja noch 'was für Dich übrig lassen. Sonst sieht das nachher so aus, als wolle ich selber nichts mehr lernen und das stimmt ja nun ganz und gar nicht. :-P

              1980 hat angerufen, es möchte seine faulen Ausreden zurück.

              Aus dem 'i.d.R.' wirst Du ja schon entnommen haben, dass ich sehr wohl darüber nachgedacht habe.

              Ich schon, der Fragesteller garantiert nicht. Und hier liegt auch das Problem.

              Ob es nun gut ist, jemandem, der selber noch nicht mit den Stringfunktionen vertraut ist, gleich einen Vollkurs zu verpassen, das bezweifele ich.

              Wir sind hier nicht in der Schule. Du hast hier nicht die Möglichkeit deinen Unterrichtsstoff in quasi-kaubare Stückchen zu verteilen. Hier beantwortest du die Frage und weist gleichzeitig oder direkt Folgend auf weitere Probleme hin, die dem Fragesteller durch deine Antwort über den Weg laufen werden.

              weiterhin schönen abend...

              --
              #selfhtml hat ein Forum?
              sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
          2. Hey

            RegExp: /<title[^>]*?>(.*?)</title>/i
            Mit preg_match() wird das ganze zum Dreizeiler.

            Hey danke. Ich hätte es btw. auch so gemacht wenn ich nicht zu blöd für Regular Expressions wäre.

            $page=file_get_contents("http://de3.php.net/preg_match");
            preg_match("/<title[^>]*?>(.*?)</title>/i",$page);

            Gibt mir übrigens int(1) aus wenn ich var_dump drüberlaufen lasse.
            Muss also irgendwas falsch laufen.

            Neben dem "manuellen" Stringgedöns könntest du den geladenen HTML-Source übrigens mit DOMDocument::loadHTML() parsen lassen.

            Dann müsste ich wieder zu sehr rumspielem zwischen PHP und Javascript, denn der Titel wird in eine Datenbank eingetragen.

            Wenn du auf dem geladenen Dokument mehr machen musst, als den <title> auszulesen, kann das recht schnell, recht sinnvoll werden.

            Nein zum Glück nicht. Gehts übrigens noch schnelelr als mit file_get_contents?

            Danke.

            1. n'abend,

              Hey danke. Ich hätte es btw. auch so gemacht wenn ich nicht zu blöd für Regular Expressions wäre.

              Wenn es nicht klappt, kannst du einfach hier nachfragen. Bei Fragen zu Regular Expressions ist es immer nett, wenn man eine Demo-Quelle, das gewünschte Resultat und deine bisherigen RegEx versuche gleich mitgeliefert bekommt... ;)

              $page=file_get_contents("http://de3.php.net/preg_match");
              preg_match("/<title[^>]*?>(.*?)</title>/i",$page);

              Gibt mir übrigens int(1) aus wenn ich var_dump drüberlaufen lasse.
              Muss also irgendwas falsch laufen.

              Du hast die Dokumentation wohl nicht gelesen, was? Andernfalls wäre dir vermutlich aufgefallen, dass preg_match *immer* 0 oder 1 zurückliefert und du die Fundstücke auf anderem Wege abholen musst:

                
              $page = file_get_contents( 'http://de3.php.net/preg_match' );  
              $matches = array();  
                
              if( !$page )  
                echo 'Page konnte nicht geladen werden...';  
                
              else if( preg_match( '/<title[^>]*?>(.*?)<\/title>/i', $page, $matches ) )  
              {  
                echo '<pre>';  
                print_r( $matches );  
                echo '</pre>';  
              }  
              else  
                echo '<title> konnte nicht gefunden werden...';
              

              »» Neben dem "manuellen" Stringgedöns könntest du den geladenen HTML-Source übrigens mit DOMDocument::loadHTML() parsen lassen.

              Dann müsste ich wieder zu sehr rumspielem zwischen PHP und Javascript, denn der Titel wird in eine Datenbank eingetragen.

              Bist du dem Irrglauben verfallen DOM gäbe es nur in Javascript? Andernfalls verstehe ich die Einbringung von Javascript in dieses durchaus serverseitige Spielchen nicht so ganz.

              »» Wenn du auf dem geladenen Dokument mehr machen musst, als den <title> auszulesen, kann das recht schnell, recht sinnvoll werden.

              Nein zum Glück nicht. Gehts übrigens noch schnelelr als mit file_get_contents?

              Schneller "programmiert"? schneller als mit einem einzigen Funktionsaufruf wirst du das wohl nicht hinbekommen.
              Schneller "ausgeführt"? Mir sind keine Geschwindigkeitsunterschiede zwischen file_get_contents() der guten alten fsockopen()-Variante, cURL und HTTPRequest (so ein widerliches PEAR Dings) bekannt. Aber spätestens wenn du auf den Trichter kommst, dass du eventuell ein paar Cookies (wegen Session oder so?) oder ein paar bestimmte HTTP-Header mitschicken willst, wirst du dich von der file_get_contents()-Methode verabschieden dürfen.

              Solltest du Zeit haben, schau dir fsockopen an. Dann bist du gezwungen dich ein wenig mit HTTP auseinanderzusetzen. Das kann nur von Vorteil sein. Bei weniger Zeit wird cURL schneller zum Erfolg führen, sofern es in deiner Zielumgebung verfügbar ist.

              weiterhin schönen abend...

              --
              #selfhtml hat ein Forum?
              sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
              1. Du hast die Dokumentation wohl nicht gelesen, was?

                Nein aber wohl zu hastig ;).

                Bist du dem Irrglauben verfallen DOM gäbe es nur in Javascript? Andernfalls verstehe ich die Einbringung von Javascript in dieses durchaus serverseitige Spielchen nicht so ganz.

                Ertappt!

                weiterhin schönen abend...

                Ebenfalls! Dankeschön für alles.

  3. Hey,

    ich möchte gerne wenn mir jemand den Link "http://forum.de.selfhtml.org/hilfe/charta.htm" gibt, dass der <title>-Tag ausgelesen wird.

    diese Seite dürfte dich vermutlich interessieren: http://de3.php.net/manual/de/features.remote-files.php

    Gruß Gunther

  4. Hey,

    ich möchte gerne wenn mir jemand den Link "http://forum.de.selfhtml.org/hilfe/charta.htm" gibt, der <title>-Tag ausgelesen wird.

    Geht sowas?

    Gruß,

    Jo

    also

    meine idee ist folgende:
    get_title('http://fenebris.com');

    funtion get_title($url)
    {
    // HTML in eine Datei pasten
    $HTML_ursprung = file_get_contents($url);

    $t1 = explode('<title>',$HTML_ursprung);
    // zerschnippeln anhand des Title tags alles VORHER abschneiden
    $t2 = explode('</title>',$t1[1]);
    // zerschnippeln anhand des Title tags alles NACHER abschneiden
    return $t2[0];
    }

    quick & dirty :)

    Greets
    Meine Kredit Beratungs Seite

    1. meine idee ist folgende:

      ich würde stristr() und strip_tags() empfehlen - ist mit Sicherheit als Arrayfunktionen.