Dino: Mit Regex Meta - Angaben auslesen ?

Hallo zusammen,

/<meta name="description" content="(.*)"$/i

Ich will die Description aus den Metatags lesen, also das was zwischen content="" steht.

Kann mir jemand sagen wie es hinbekomme das der Regex hinter dem content="" schluss macht ?

Oder hat vieleicht jemand eine Regex die auf:

<meta name="description" content="">
<meta name="description" content="" />
<meta name = "description" content="" >

passt ? Man weiss ja nie wie der Quelltext ausschaut ..

Danke, Dino ...

  1. Heißa, Dino,

    Kann mir jemand sagen wie es hinbekomme das der Regex hinter dem content="" schluss macht ?

    Setze den regulären Ausdruck einfach auf „nicht gierig“. Das sollte das Problem beheben.

    Caramba!
    Grüße aus Biberach Riss,
    Candid Dauth (ehemals Dogfish)

    --
    „Bevorzuge Gerechtigkeit auch dann, wenn sie deinen eigenen Nachteil bedeutet.“ | Mein SelfCode
    http://cdauth.de/
  2. Hallo!

    Ich will die Description aus den Metatags lesen, also das was zwischen content="" steht.

    /<meta name=[\s]*"description" content="(.*)"[\s]*/?>/is

    André Laugks

    --
    Die Frau geht, die Hilti bleibt!
    1. hallo André,

      Ich will die Description aus den Metatags lesen, also das was zwischen content="" steht.
      /<meta name=[\s]*"description" content="(.*)"[\s]*/?>/is

      Ja, das funktioniert ganz gut. Aber mal eine vergleichbare Aufgabenstellung, mit der ich noch nicht wirklich zurande gekommen bin:
      Ein PHP-Script soll HTML-Dateien, die zum selben "Projekt" gehören, einlesen und darstellen. Das ist noch kein Problem. Jetzt hat das Script selbst aber schon einen Header-Bereich mit <!DOCTYPE...> und <meta ...>. Also müssen beim Einlesen von HTML-Dateien die dort befindliche Header gestrichen werden, damit valides HTML zustandekommt. Auch das ist noch kein allzu großes Problem, da die Header überall nahezu identisch sind. Bei einigen Seiten  -  nicht bei allen  -  gibt es aber zusätzliche <script ...>-Einschübe. Und da hänge ich.
      Ich kann mir bisher nur so helfen, daß die Headerzeilen einzeln gelöscht werden. Das funktioniert zwar am Ende, ist aber bissel viel Tipperei. Was ich nicht richtig hinkriege, ist, _alles_, was zwischen <!DOCTYPE ...> und <body> steht, auf einen Rutsch rauszuwerfen, egal, welche Zeichen darin enthalten sind. Wenn ich den Suchausdruck nach dem Schema /<.+>/ "gierig" mache, hält er ja bei <body> nicht an, sondern frißt alles andere auch noch. Wenn ich ihn aber "genügsam" lasse, muß ich eben jede einzelne Header-Zeile bearbeiten.

      Beispiel (wird etwas mehr Code, sorry):

      <?php  
      if ($QUERY_STRING == "blah"){  
      echo <<<ENDE  
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
      <html><head><title>Projektname</title>  
      <meta http-equiv="Content-Language" content="de">  
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">  
      <link rel="stylesheet" type="text/css" href="allgemein.css">  
      </head><body>  
      <p>Hier wird eine Datei eingelesen</p><hr>  
      ENDE;  
         $zeilen = fopen ("http://www.domain.tld/", 80);  
         $suchen[0] = "=([\r\n])[\s]+=";  
         $suchen[1] = "=<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN\">=";  
         $suchen[2] = "=<html><head><title>.*<\/title>=";  
         $suchen[3] = "=<meta http-equiv\=\"Content-Language\" content\=\"de\">=";  
         $suchen[4] = "=<meta http-equiv\=\"Content-Type\" content\=\"text\/html; charset\=windows-1252\">=";  
         $suchen[5] = "=<link rel\=\"stylesheet\" type\=\"text\/css\" href\=\"allgemein.css\">=";  
         $suchen[6] = "=</head><body>=";  
      //   $ersetzen[0] = "\\1";  
      //   $ersetzen[1] = "";  
         $ersetzen = "";  
         while (!feof($zeilen)) {  
         $ausgabe = fgets($zeilen,128);  
         echo preg_replace($suchen, $ersetzen, $ausgabe);}  
         echo "<p>&nbsp;</p><hr><a href='/'>zurück</a>\n";  
         echo "</body></html>";  
         exit();  
      }
      

      Das funktioniert einigermaßen zufriedenstellend. Ich möchte diesen ganzen Regex-Kram aber gerne in eine Variable packen, um dasselbe Ergebnis auf alle HTML-Dokumente des "Projekts" anwenden zu können  -  die einzelnen Seiten werden über jeweils veränderte Parameter aufgerufen. Und da gibts dann eben auch ein paar Seiten, die mit dem bisherigen Ausdruck nicht vollständig "erwischt" werden  -  sei es, daß noch irgendein anderer <meta> drinsteckt oder daß es eben <script>-Bereiche gibt oder zusätzlich <style>-Angaben für seitenspezifische Formatierungen abweichend von der zentralen CSS.

      Grüße aus Berlin

      Christoph S.

      1. Hallo Christoph!

        Ein PHP-Script soll HTML-Dateien, die zum selben "Projekt" gehören, einlesen und darstellen. Das ist noch kein Problem. Jetzt hat das Script selbst aber schon einen Header-Bereich mit <!DOCTYPE...> und <meta ...>. [...]

        So, wie ich das verstanden habe (mit der leckeren Flasche Wein in meinem Kopf), möchtest Du alles zwischen header einlesen.

        Mit dem Ausdruck

        /<!DOCTYPE.*?>[\s]*<html.*?>(.*)<body.*?>/is

        sollte (getestet) im Index mit der Nr. 1 der gesamte header stehen.

        preg_match('/<!DOCTYPE.*?>[\s]*<html.*?>(.*)<body.*?>/is', $html_datei, $match);
        echo $match[1];

        // $html_datei
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html><head><title>Hier ist der Titel</title>
        <meta http-equiv="Content-Language" content="de">
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
        <link rel="stylesheet" type="text/css" href="allgemein.css">
        <script type="text/javascript">
        <!--
        // Hier ist ein Script
        //-->
        </script>
        </head>
        <body>
        Hier ist der Quelltext
        </body>
        </html>

        Wenn ich den Suchausdruck nach dem Schema /<.+>/ "gierig" mache, hält er ja bei <body> nicht an, [...]

        IMHO ist das Plus der Übeltäter. Das Plus bedeutet ja mindestens einmal. Es ist gefräßiger als ein Fragezeichen (gar nicht oder nur einmal).

        André Laugks

        --
        Die Frau geht, die Hilti bleibt!
        1. Wenn es nur der Header sein soll, geht es auch mit:

          /(<head>(.*)</head>)/is

          Index 1: Alles innerhalb von <head> und </head> inklusive der HTML-Tags .
          Index 2: Alles innerhalb von <head> und </head>.

          André Laugks

          --
          Die Frau geht, die Hilti bleibt!
          1. /(<head>(.*)</head>)/is

            No drink in forum!

            Besser so, weil es dürfen ja vor dem > Leerzeichen stehen.

            (<head[\s]*>(.*)</head[\s]*>)

            André Laugks

            --
            Die Frau geht, die Hilti bleibt!
            1. öhm ...,

              No drink in forum!

              Das kann ich nur _dringlich_ befürworten. Ich hatte dir bereits auf deine erste Antwort eine ausführliche, sachliche und fundierte Re-Antwort geschrieben, aber ich hab sie mir danach in der Vorschau angekuckt  -  und vergessen, daß das die Vorschau war und das Fenster zugemacht (weil ich grade nebenbei über meine TVKarte mir "Men in Black II" reinziehe). Prima. Nun ist sie fort :-( Dabei hab ich noch nicht einen einzigen Tropfen Holunderwein zu mir genommen und nur ein klitzekleines bißchen vom Hagebuttenwein gekostet, der dringend verschnitten werden muß.

              Aber ich muß jetzt erstmal alle deine Vorschläge durchtesten.

              Grüße aus Berlin

              Christoph S.

  3. Dino,
    Warum willst du das mit einem regulären Ausdruck lösen und benutzt nicht das DOM und entsprechende PHP-Funktionen?
    Gunnar

    --
    “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
    1. Hallo!

      Warum willst du das mit einem regulären Ausdruck lösen und benutzt nicht das DOM und entsprechende PHP-Funktionen?

      Dazu benötigst Du aber XHTML, also XML konformes HTML.

      André Laugks

      --
      Die Frau geht, die Hilti bleibt!