Claudia B.: PHP - Tags einlesen - ausschließen

Ich lese mittels PHP eine Seite ein:

<?php
 $str_a = implode("", @file("file.htm"));
 $str_a = strip_tags($str_a, "<table>, <font>,<body>,<tr>,<td>, <a>, <p>,<img>,<b>");
echo $str_a;
?>

Jetzt habe ich das Problem, dass der Title-Tag von file.htm nicht als Tag übernommen wird. Er wird ganz einfach als Text ausgegeben. Ich kann zwar im strip_tags auch <title> aufnehmen, jedoch baue ich mir damit eine Seite, die nicht html-konform ist, da ich die entgültige Seite aus verschiedenen Fragmenten zusammensetzte und dort nur 1 x der Title-Tag im Header vorkommen sollte.

Kann ich das o. g. Script erweitern, sodass der Title einfach gar nicht mehr berücksichtigt wird?

Danke.

  1. kann dir leider nich follgen.
    Du hast ne file, die möchtest du anzeigen. Wie sieht die file aus?

    1. Gibt noch kleine Probleme:

      $str_a = strip_tags($str_a, "<table>, <font>,<body>,<tr>,<td>, <a>, <p>,<img>,<b>");

      preg_replace($str_a, "!<title>(.*?)</title>!i");
      echo $str_a2;

      Warning: Wrong parameter count for preg_replace()

      Hab ich die Funktion falsch benutzt??

      Danke.

      Claudia....

  2. Jetzt habe ich das Problem, dass der Title-Tag von file.htm nicht als Tag übernommen wird. Er wird ganz einfach als Text ausgegeben. Ich kann zwar im strip_tags auch <title> aufnehmen, jedoch baue ich mir damit eine Seite, die nicht html-konform ist, da ich die entgültige Seite aus verschiedenen Fragmenten zusammensetzte und dort nur 1 x der Title-Tag im Header vorkommen sollte.

    Moin,
    du könntest entweder bevor du die Tags entfernst das ">" von <title> und das "</" von </title> entfernen, dann wäre das ganze _ein_ Tag der mit gelöscht wird, is aber ne unelegante Lösung.
    Oder du ersetzt mit eregi_replace() einfach den title-Tag.

    cu RFZ

    1. Hallo RFZ,

      Oder du ersetzt mit eregi_replace() einfach den title-Tag.

      ereg sollte man nicht mehr verwenden und erst Recht nicht als Hilfestellung anbieten. preg ist schneller, flexibler und außerdem noch binärsicher.

      Viele Grüße,
      Christian

      1. Moin,

        ereg sollte man nicht mehr verwenden und erst Recht nicht als Hilfestellung anbieten. preg ist schneller, flexibler und außerdem noch binärsicher.

        Warum nicht? Davon hab ich bisher nix gehört, wo liegt das Problem bei ereg?
        Oder ist es einfach nur bissal schlechter als preg, was jetzt aber nicht wirklich ein Problem wäre?

        Viele Grüße,
        Christian

        cu RFZ

        1. Hallo RFZ,

          Davon hab ich bisher nix gehört, wo liegt das Problem bei ereg?

          Sobald ein 0-Byte (d.h. Byte mit folgenden Bits: 00000000) irgendwo auftaucht versagt es. Im Sinne: in diesem Fall denkt es, die Zeichenkette wäre bereits zuende.

          <?php
          $a = ereg ("a", "\0 a");
          $b = preg_match ("/a/", "\0 a");
          var_dump ($a);
          var_dump ($b);
          ?>

          Ergibt:

          bool(false)
          int(1)

          Oder ist es einfach nur bissal schlechter als preg,

          preg ist nach meinen Tests fast doppelt so schnell und hat _deutlich_ mehr Features.

          Wenn Du selbst ereg in Deinen Scripten verwenden willst, bitte, solange Du mit der geringeren Anzahl an Features, der schlechteren Performance und diesem 0-Byte-Problem leben kannst.

          Aber (und genau darauf kommt es mir an): Wenn Du hier eine Hilfestellung gibst, dann solltest Du immer die bestmögliche Lösung empfehlen, und preg hat im Vergleich zu ereg _keine_ Nachteile. Denn für die konkrete Problemlösung mag ereg noch gut funktionieren, aber falls das ganze etwas abgewandelt werden soll, kann man durchaus an die Grenzen von ereg stoßen. (nicht-matchende Klammern z.B.)

          Viele Grüße,
          Christian

          1. Sobald ein 0-Byte (d.h. Byte mit folgenden Bits: 00000000) irgendwo auftaucht versagt es. Im Sinne: in diesem Fall denkt es, die Zeichenkette wäre bereits zuende.

            preg ist nach meinen Tests fast doppelt so schnell und hat _deutlich_ mehr Features.

            OK danke, werd ich mir merken. Aber in sonem normal-gebrauch wo man nen Tag entfernt, oder ne kleine Textzeile umwandelt, sollte das ja kein Problem sein ;)
            Aber is gut zu wissen!

            Viele Grüße,
            Christian

            cu RFZ

            1. Hallo RFZ,

              Aber in sonem normal-gebrauch wo man nen Tag entfernt, oder ne kleine Textzeile umwandelt, sollte das ja kein Problem sein ;)

              Das ist das Totschlagargument gegen jegliche Art vorrausschauenden Performance-Tunings. ;-)

              Viele Grüße,
              Christian

  3. Hallo Claudia,

    Kann ich das o. g. Script erweitern, sodass der Title einfach gar nicht mehr berücksichtigt wird?

    Entferne ihn doch mit preg_replace. (vor dem strip_tags) Ein geeigneter regulärer Ausdruck wäre "!<title>(.*?)</title>!i".

    Viele Grüße,
    Christian

  4. @christian Seiler
    @RFZ

    vielen Dank für die schnelle Hilfe.

  5. Gibt noch kleine Probleme:

    $str_a = strip_tags($str_a, "<table>, <font>,<body>,<tr>,<td>, <a>, <p>,<img>,<b>");

    preg_replace($str_a, "!<title>(.*?)</title>!i");
    echo $str_a2;

    Warning: Wrong parameter count for preg_replace()

    Hab ich die Funktion falsch benutzt??

    Danke.

    Claudia....

    1. Hallo Claudia,

      $str_a = strip_tags($str_a, "<table>, <font>,<body>,<tr>,<td>, <a>, <p>,<img>,<b>");
      preg_replace($str_a, "!<title>(.*?)</title>!i");

      ich glaube nicht, dass du nach strip_tags() noch eine title-Element finden wirst...

      Warning: Wrong parameter count for preg_replace()
      Hab ich die Funktion falsch benutzt??

      ja, preg_replace erwartet (wie afaik alle *_replace()-Funktionen) (mindestens) drei Parameter - du hast aber nur 2 angegeben - schau dir http://de.php.net/preg_replace nochmal an.

      Grüße aus Nürnberg
      Tobias

      --
      Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|