<body>(.*)</body> aus HTML extrahieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • <body>(.*)</body> aus HTML extrahieren

    Hi,

    komme ich damit klar, wenn ich den Quelltext einer Seite auf den Body reduzieren möchte oder muss ich noch irgendwas besonderes berücksichtigen?
    Code:
    $src = preg_replace('#<html.*<body.*>(.*?)</body.*>.*</html.*>#Uis', '\\1', $src);
    Ich habe den Wert in den Klammern greedy gemacht, da es theoretisch sein kann, dass durch einen Fehler zwei <body>'s auf der Seite sein könnten. Hatte ich schon mal bei einem Kunden gesehen, weil der ein CMS hatte, dass einfach HTML-Seiten als Content includierte und die Seite ging trotzdem.

    EDIT: Hmm.. ersetzt der dann das zwei mal oder nur einmal? Also was macht der aus:
    Code:
    <html>
    <head>
    </head>
    <body>
    Inhalt 1
    <html>
    <head>
    </head>
    <body>
    Inhalt 2
    </body>
    </html>
    </body>
    </html>
    Muss ich wohl mal testen...

    EDIT2:
    Ok daraus wird:
    Code:
    Inhalt 1
    <html>
    <head>
    </head>
    <body>
    Inhalt 2
    </body>
    </html>
    Das ist schlecht :P

    EDIT3:
    Ich denke ich lösche danach noch mal alle <html>, <head> und <body> Bereiche. Dann dürfte das klappen. Ich will nämlich Inhalt2 nicht haben.

    Gruß
    Marc
    Zuletzt geändert von mgutt; 19.06.2009, 13:59.
    mein Honda Forum | meine Scripte

  • #2
    Zitat von mgutt Beitrag anzeigen
    komme ich damit klar
    Weiss nicht - sag's uns ...
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Zitat von mgutt Beitrag anzeigen
      Hi,

      komme ich damit klar, wenn ich den Quelltext einer Seite auf den Body reduzieren möchte oder muss ich noch irgendwas besonderes berücksichtigen?
      Code:
      $src = preg_replace('#<html.*<body.*>(.*?)</body.*>.*</html.*>#Uis', '\\1', $src);
      Ich habe den Wert in den Klammern greedy gemacht, ...
      Lazy wäre wohl richtig gewesen ...
      Aber man kommt schnell durcheinander, wenn man den Verdreh-Modifikator /U benutzt. Deshalb lasse ich den gewöhnlich weg, und schreibe lieber ein paar Fragzeichen mehr in den RegEx.

      Du solltest zum "Ausschneiden" eines Teilstrings besser die passende Funktion benutzen. Preg_replace() hat (u. A.) den Nachteil, dass du den ganzen Originalstring bekommst, wenn dein RegEx nicht passt.

      PHP-Code:
      $part preg_match('/<html.*?<body.*?>(.*?)<\/body.*?>.*?<\/html.*?>/is'$html_src$hits)
              ? 
      $hits[1] : ''
      da es theoretisch sein kann, dass durch einen Fehler zwei <body>'s auf der Seite sein könnten. Hatte ich schon mal bei einem Kunden gesehen, weil der ein CMS hatte, dass einfach HTML-Seiten als Content includierte und die Seite ging trotzdem.
      Ja, die HTML-Parser der gängigen Webbrowser sind schon arme Schweine. Die müssen auch den größten Unfug in irgendwie darstellbare Form bringen.

      Ich denke ich lösche danach noch mal alle <html>, <head> und <body> Bereiche. Dann dürfte das klappen. Ich will nämlich Inhalt2 nicht haben.
      Siehe mein Vorschlag ...
      Zuletzt geändert von fireweasel; 19.06.2009, 22:39.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        Zitat von fireweasel Beitrag anzeigen
        Lazy wäre wohl richtig gewesen ...
        Aber man kommt schnell durcheinander, wenn man den Verdreh-Modifikator /U benutzt. Deshalb lasse ich den gewöhnlich weg, und schreibe lieber ein paar Fragzeichen mehr in den RegEx.
        Ich nicht und wenn Du noch mal hinschaust, siehst Du, dass er Greedy ist. Ich arbeite beim body genauso wie der Browser. Der nimmt nur die äußeren Tags. Dein preg_match()-Beispiel dagegen die inneren Tags, wodurch ein eingebettes HTML zum vorzeitigen Abbruch der Verarbeitung führt und alles was nach dem eingebetteten HTML kommt wird dadurch ignoriert. Der Browser dagegen stellt auch noch das alles dar, weil er gar nicht nach einem Ende sucht. Daher hat google.de auch keine endenden body- und html-Tags.

        Du solltest zum "Ausschneiden" eines Teilstrings besser die passende Funktion benutzen. Preg_replace() hat (u. A.) den Nachteil, dass du den ganzen Originalstring bekommst, wenn dein RegEx nicht passt.
        Was Du als Nachteil bezeichnest, sehe ich als Vorteil und ich würde die Argumentation auch vollkommen umdrehen, da ich nichts ausschneiden möchte, sondern löschen (den Kopf und den Fuß). Du löschst den Quellcode weiterhin komplett, wenn nichts gefunden wurde.

        Ich will aber - bei nicht vorhandenen html- und body-Tags - das haben was übrigt bleibt, weil man dann davon ausgehen muss, dass der Webmaster die entsprechenden Tags weggelassen hat. Weiterhin ist preg_replace() performanter, da es ohne eine zusätzliche Bedingung und ohne ein zusätzliches Array auskommt.
        mein Honda Forum | meine Scripte

        Kommentar


        • #5
          Zitat von wahsaga Beitrag anzeigen
          Weiss nicht - sag's uns ...
          Damit wollte ich auf bestimmte Eventualitäten anspielen, die ich selbst vielleicht nicht bedacht habe.

          Ich habe z.B. die Groß- und Kleinschrift ignoriert und berücksichtigt, dass nach einem öffnenden Tag noch weitere Zeichen folgen könnten. Vielleicht gibts ja noch was, was ich vergessen habe.
          mein Honda Forum | meine Scripte

          Kommentar

          Lädt...
          X