Themm: Seitentitel holen

Hi euch allen :D,
ich wusste nicht, ob ich diese Post dem Themenbereich HTML, HTTP oder PHP zu ordnen sollte - deshalb PROGRAMMIERTECHNIK. ;)
Mein Problem:
Ich möchte den Seitentitel der URL herausfinden. Die URL ist nicht festgelegt, sondern eine Variabeln. - Ich hoffe hiermit ist alles Wicchtige gesagt. :)

  1. hi,

    der titel der seite steht im entsprechenden HTML-Tag im head der Seite.
    JS kann das z.b. über getElementsByName auslesen

    PHP erzeugt HTML und beides weiß somit eigentlich schon den eigenen Titel ;)
    Wenn du auf eine andere Seite schauen möchtest, dann z.b. mit php den quelltext auslesen und z.b. als xml verarbeitet auf das titel-tag zugreifen.
    (Geht glaub ich bei per JS veränderten Titeln nicht, da js nicht ausgeführt wird beim PHP-Aufruf)

    Ich hoffe du kannst meiner Antwort entnehmen, dass es zu wenig Infos waren =P

    Gruß Niklas

    --
    Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    1. Ich hoffe du kannst meiner Antwort entnehmen, dass es zu wenig Infos waren =P

      Ja, also ich habe eine Variabel $url. Diese Variabel enthält die URL z.B. www.example.com . Nun möchte ich mit einer Funktion den Titel (<titel>Hier gesuchter Titel.</titel>) der Webseite zurückbekommen.

      Gruß Niklas

      Einen freundlichen Gruß zurück. :-)

      1. hi,

        Ich hoffe du kannst meiner Antwort entnehmen, dass es zu wenig Infos waren =P

        Ja, also ich habe eine Variabel $url. Diese Variabel enthält die URL z.B. www.example.com . Nun möchte ich mit einer Funktion den Titel (<titel>Hier gesuchter Titel.</titel>) der Webseite zurückbekommen.

        Also von einer externen webseite!?

        Dann wie beschrieben, einfach die Seite einlesen (z.b. als XML oder simpel als String) und dann durchsuchen lassen. Bei einem String z.b. per Regex.
        Es kann natürlich immer Seiten geben, bei denen du den Titel nicht lesen kannst auf diese Weise. Manch stümpercms (von kleinen Firmen) setzt den Seitentitel nachträglich per JS. Das würde also daneben gehen ...

        So als Funktionsidee: readfile ('');

        Viel Spaß beim Basteln

        Schönes Wochenende!

        --
        Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
        1. Also von einer externen webseite!?

          Ja.

          1. Theoretisch könnte man mit http_head($url) einen String zurückkriegen. Wie könnte man diesen String so verarbeiten das der Text nach <title> und vor </title> ausgegeben wird?

            1. hi,

              eine möglichkeit wäre <titel> suchen und bis dort wegschneiden, dann noch mal nach </titel> suchen und bis dort alles nehmen.

              Regex wäre aber schöner. Da bin ich aber nicht geübt genug ;)

              Gruß Niklas

              --
              Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
              1. @@niklaskamenisch:

                nuqneH

                eine möglichkeit wäre <titel> suchen

                Im Allgemeinen ist das keine Möglichkeit, da '<title>' im Quelltext nicht unbedingt vorkommt.

                Qapla'

                --
                Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
                1. Hallo,

                  Im Allgemeinen ist das keine Möglichkeit, da '<title>' im Quelltext nicht unbedingt vorkommt.

                  Hm, wie meinst du das? Ist <title> nicht eines der wenigen Elemente die bei einem HTML-Dokument wirklich auch vorgeschrieben sind?

                  Jeena

                  1. Om nah hoo pez nyeetz, Jeena Paradies!

                    Im Allgemeinen ist das keine Möglichkeit, da '<title>' im Quelltext nicht unbedingt vorkommt.
                    Hm, wie meinst du das? Ist <title> nicht eines der wenigen Elemente die bei einem HTML-Dokument wirklich auch vorgeschrieben sind?

                    oh oh: Änderung des Zitats!

                    in Niklas' Posting war ein Tipfelher. Da hieß es <titel>.

                    Matthias

                    --
                    1/z ist kein Blatt Papier.

                    1. Hallo,

                      oh oh: Änderung des Zitats!

                      Ah hehe ok, dabei hat Gunnar das sogar noch in Zitationszeichen reingemacht, da habe ich auf den Orginaltext gar nicht mehr geschaut.

                      Jeena

                    2. @@Matthias Apsel:

                      nuqneH

                      in Niklas' Posting war ein Tipfelher. Da hieß es <titel>.

                      Das war mir entgangen.

                      Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.

                      Qapla'

                      --
                      Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
                      1. Hallo,

                        Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.

                        Ah, guter Einwand, daran habe ich bei meiner Lösung auch nicht gedacht.

                        Jeena

                        1. @@Jeena Paradies:

                          nuqneH

                          Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.
                          Ah, guter Einwand, daran habe ich bei meiner Lösung auch nicht gedacht.

                          Und wenn du jetzt mit <title[^>]*> kommst, schmetter ich die <title id="a>"> entgegen.

                          Qapla'

                          --
                          Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
                          1. Hallo,

                            Und wenn du jetzt mit <title[^>]*> kommst, schmetter ich die <title id="a>"> entgegen.

                            Hehe scheiße!

                            Naja gut, ich glaube beim überwiegendem Teil von Webseiten wird das aber dann dennoch funktionieren, und bevor man den Regex noch komplizierter zu machen versucht ist es wohl sinnvoller gleich einen DOM-Parser zu benutzen.

                            Jeena

                            1. @@Jeena Paradies:

                              nuqneH

                              Naja gut, ich glaube beim überwiegendem Teil von Webseiten wird das aber dann dennoch funktionieren

                              Das Problem ist, dass die eigene Seite nicht funktioniert, wenn auf der fremden Seite das Markup nicht so ist, wie man’s gern hätte.

                              Das Script muss schon so robust sein, dass es mit allem klarkommt, was da so kommen kann.

                              Qapla'

                              --
                              Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
                              1. Hallo,

                                Das Problem ist, dass die eigene Seite nicht funktioniert, wenn auf der fremden Seite das Markup nicht so ist, wie man’s gern hätte.

                                Naja, nicht ganz, sie verhält sich so als ob die fremde Seite kein title-Element hätte (obwohl sie eines hat). Man kann das natürlich als "nicht funktionieren" definieren, aber ich würde das nicht in jedem Fall tun, kommt drauf an was die Hauptaufgabe meiner Seite ist.

                                Jeena

                          2. @@Gunnar Bittersmann:

                            nuqneH

                            Und wenn du jetzt mit <title[^>]*> kommst,

                            Jetzt hat er’s doch getan … ;-)

                            Qapla'

                            --
                            Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
                        2. Om nah hoo pez nyeetz, Jeena Paradies!

                          Was ich meinte: Zwischen '<title' und '>' darf Whitespace stehen. Und Attribute.
                          Ah, guter Einwand, daran habe ich bei meiner Lösung auch nicht gedacht.

                          Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?

                          Matthias

                          --
                          1/z ist kein Blatt Papier.

                          1. @@Matthias Apsel:

                            nuqneH

                            Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?

                            Das ist nicht die Frage. Es kann welche haben. Und man hat keinen Einfluss drauf, ob es welche hat. Hier entlang …

                            Qapla'

                            --
                            Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
                          2. Hallo,

                            Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?

                            Mir fallen da sofort die "data-"-Attribute ein.

                            Jeena

                          3. @@Matthias Apsel:

                            nuqneH

                            Für welche sinnvollen Anwendungsmöglichkeiten muss das title-Element Attribute besitzen?

                            Mir fiele da @lang ein, wenn der Seitentitel in einer anderen Sprache als der Seiteninhalt ist (komplett anders, sonst geht's nicht).

                            Qapla'

                            --
                            Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
            2. Theoretisch könnte man mit http_head($url) einen String zurückkriegen. Wie könnte man diesen String so verarbeiten das der Text nach <title> und vor </title> ausgegeben wird?

              Du verwechselst da das HTML-Head-Element mit dem HTTP-Header. Und darin wirst du den Titel nicht finden. http_head ist für dich also nutzlos - du kannst stattdessen aber http_get benutzen. Die Antwort kannst du dann zum Beispiel mit der DOM-Api weiterverarbeiten.

    2. Om nah hoo pez nyeetz, niklaskamenisch!

      der titel der seite steht im entsprechenden HTML-Tag im head der Seite.

      Element, nicht Tag.

      JS kann das z.b. über getElementsByName auslesen

      Das Title-Element darf kein Name-Attribut haben, du meinst sicher getElementsByTagName.

      Matthias

      --
      1/z ist kein Blatt Papier.

      1. hi,

        Das Title-Element darf kein Name-Attribut haben, du meinst sicher getElementsByTagName.
        Ja natürlich das xD sorry, war wohl doch etwas spät gestern ...
        Danke für die korrektur!

        Matthias

        Gruß Niklas

        --
        Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
  2. Hallo,

    Ich möchte den Seitentitel der URL herausfinden. Die URL ist nicht festgelegt, sondern eine Variabeln. - Ich hoffe hiermit ist alles Wicchtige gesagt. :)

    <?php  
      
    $url = "http://google.com";  
      
    // Die 9000 sind dazu da um nach 9000 Zeichen das runterladen abzubrechen  
    // wenn bis dahin noch kein title gefunden wird dann ist es eher unwahrscheinlich  
    // dass da überhaupt einer ist.  
      
    $str = file_get_contents($url, false, NULL, 0, 9000);  
    preg_match("#<title>(.*?)</title>#", $str, $r);  
      
    if(isset($r[1])) {  
            echo $r[1]; // Titel wird ausgegeben  
    } else {  
            echo "no title found";  
    }
    

    Jeena

    1. @@Jeena Paradies:

      nuqneH

      preg_match("#<title>(.*?)</title>#", $str, $r);

      Nein.

      Qapla'

      --
      Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
      1. Hallo,

        preg_match("#<title>(.*?)</title>#", $str, $r);
        Nein.

        Guter Einwand. Vielleicht mit einer kleinen Anpassung?

        preg_match("#<title[^>]*>(.*?)</title>#", $str, $r);

        Jeena

        1. @@Jeena Paradies:

          nuqneH

          preg_match("#<title>(.*?)</title>#", $str, $r);
          Nein.
          Guter Einwand. Vielleicht mit einer kleinen Anpassung?

          preg_match("#<title[^>]*>(.*?)</title>#", $str, $r);

          Nein. Die Anpassung ist zu klein.

          Mir regulärem Ausdruck wird’s zu kompliziert (wenn’s überhaupt geht). Ein Parser wäre wohl Mittel der Wahl.

          Qapla'

          --
          Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
          1. Hallo,

            Nein. Die Anpassung ist zu klein.
            Mir regulärem Ausdruck wird’s zu kompliziert (wenn’s überhaupt geht). Ein Parser wäre wohl Mittel der Wahl.

            Jup denke ich auch. Kommt wohl drauf an wie wichtig es einem ist auch die ungewöhnlicheren Fälle mit zu berücksichtigen, die nicht so oft vorkommen. Wenn es ausreicht dass es bei 99% der Fälle funktioniert dann kann man auch mit dem regex leben.

            Jeena

            1. Om nah hoo pez nyeetz, Jeena Paradies!

              Jup denke ich auch. Kommt wohl drauf an wie wichtig es einem ist auch die ungewöhnlicheren Fälle mit zu berücksichtigen, die nicht so oft vorkommen. Wenn es ausreicht dass es bei 99% der Fälle funktioniert dann kann man auch mit dem regex leben.

              0. Was ich denke, ist bedeutungslos.
              1. Ich denke, dass es wesentlich mehr websiten ohne title-Element gibt als solche, deren title-Element Attribute hat.
              2. preg_match("#<title(.*?)</title>#", $str, $r); und aus $r[1] das erste Zeichen entfernen, findet dieselben Seiten wie dein erster Entwurf. Bei den anderen ist der Titel wenigstens Teilmenge des Suchergebnisses.

              Matthias

              --
              1/z ist kein Blatt Papier.

              1. Tach!

                1. Ich denke, dass es wesentlich mehr websiten ohne title-Element gibt als solche, deren title-Element Attribute hat.

                1.a) Die Wahrscheinlichkeit, dass title-Elemente in mehr als einer Zeile notiert sind, dürfte auch höher sein, als welche mit Attributen. Der Regexp sollte also wenigstens Mehrzeiligkeit berücksichtigen. Das bekommt man recht billig mit einem angehängten s nach dem hinteren Delimiter.

                dedlfix.

                1. Hello,

                  was mich wirklich wundert ist, dass PHP noch keinen HTML-Parser als festen Bestandteil enthält.

                  Und je öfter hier derartige Postings mit "das geht aber so nicht" beantwortet werden, steigt bei mir der Eindruck, dass (x)HTML eine Geheimwissenschaft ist (bleiben soll). Wie man Seiten wieder auseinadernimmt, dürfen nur die Browser (noch nichtmal deren Hersteller *g*) und Google wissen. Denn sonst würde ja die Welt stehenbleiben.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

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

                    Und je öfter hier derartige Postings mit "das geht aber so nicht" beantwortet werden, steigt bei mir der Eindruck, dass (x)HTML eine Geheimwissenschaft ist (bleiben soll). Wie man Seiten wieder auseinadernimmt, dürfen nur die Browser (noch nichtmal deren Hersteller *g*) und Google wissen. Denn sonst würde ja die Welt stehenbleiben.

                    Hm, ich nahm einfach an dass die Antwort "geht mit einem HTML-Parser" ausreichen würde damit man sich dann einfach einen Sucht und in die Doku schaut wie man ihn benutzt. Aber gut ich poste mal hier den code:

                    <?php  
                      
                    $url = "http://google.com";  
                    $html_str = file_get_contents($url);  
                      
                    $doc = new DOMDocument();  
                    $doc->loadHTML($html_str);  
                    $titles = $doc->getElementsByTagName("title");  
                      
                    if($titles->length > 0) {  
                            $title = $titles->item(0);  
                            echo $title->textContent;  
                    } else {  
                            echo "no title element found";  
                    }
                    

                    Jeena

                    1. Hello,

                      Hm, ich nahm einfach an dass die Antwort "geht mit einem HTML-Parser" ausreichen würde damit man sich dann einfach einen Sucht und in die Doku schaut wie man ihn benutzt. Aber gut ich poste mal hier den code:

                      Das ist wirklich lieb von Dir :-)

                      <?php

                      $url = "http://google.com";
                      $html_str = file_get_contents($url);

                      $doc = new DOMDocument();
                      $doc->loadHTML($html_str);
                      $titles = $doc->getElementsByTagName("title");

                      if($titles->length > 0) {
                              $title = $titles->item(0);
                              echo $title->textContent;
                      } else {
                              echo "no title element found";
                      }

                        
                      Und wenn Du jetzt noch verlinken könntest, mit welcher HTML-Parser-Klasse Du das ausprobiert hast, dann würde ich dem Thread drei Sternchen geben für gute gegeseitige Unterstützung bei Web-Entwicklern und zielführende Behandlung der Aufgabenstellung aus dem O-Post.  
                        
                      \*cheese\*  
                        
                        
                        
                        
                        
                        
                      Liebe Grüße aus dem schönen Oberharz  
                        
                        
                      Tom vom Berg  
                      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                        
                      
                      -- 
                       ☻\_  
                      /▌  
                      / \ Nur selber lernen macht schlau  
                      <http://bergpost.annerschbarrich.de>
                      
                      1. مرحبا

                        Und wenn Du jetzt noch verlinken könntest, mit welcher HTML-Parser-Klasse Du das ausprobiert hast, dann würde ich dem Thread drei Sternchen geben

                        http://php.net/manual/de/class.domdocument.php, und DOMDocument::getElementsByTagName (sehr schön, kannte ich alles noch garnicht)

                        Und jetzt her mit den Sternchen ;)

                        mfg

                      2. Hallo,

                        Hm, ich nahm einfach an dass die Antwort "geht mit einem HTML-Parser" ausreichen würde damit man sich dann einfach einen Sucht und in die Doku schaut wie man ihn benutzt. Aber gut ich poste mal hier den code:

                        Und wenn Du jetzt noch verlinken könntest, mit welcher HTML-Parser-Klasse Du das ausprobiert hast, dann würde ich dem Thread drei Sternchen geben für gute gegeseitige Unterstützung bei Web-Entwicklern und zielführende Behandlung der Aufgabenstellung aus dem O-Post.

                        Malcom hat das jetzt noch mal ein bisschen aufgedröselt aber der Link war schon drin, vielleicht etwas versteckt hinter dem Wörtchen Doku :)

                        Jeena

                        1. Hello Jeena,

                          Malcom hat das jetzt noch mal ein bisschen aufgedröselt aber der Link war schon drin, vielleicht etwas versteckt hinter dem Wörtchen Doku :)

                          Danke für die Mitwirkung. Den Link habe ich nicht gesehen. Könnte also einem Nachleser dann erst recht passieren :-O

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

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