Günni: Wie definiert php eine Zeile?

Hi,

ich möchte über
-------------schnipp--------------------------------------
$inhalt = file($datei);
foreach ($inhalt as $zeile)
{
$zeile=eregi_replace( "<table[^>]*>", "", $zeile);
$zeile=eregi_replace( "<tr[^>]*>", "", $zeile);
usw.
echo ("$zeile");
}
-----------------schnapp---------------------------------

in einer oder mehreren Dateien Textpassagen verändern.
Was macht php, wenn eine der gesuchten Textpassagen über 2 Zeilen geht?
Oder akzeptiert php überhaupt keinen autom. Zeilenumbruch und sieht alles als eine Zeile an, bin zum "manuellen Return"?

Zusatzfrage: Ist das eine gängige Lösung meines Problems oder geht das auch schneller oder effizienter?

Grüße
Günni

  1. Moin!

    Hi,

    ich möchte über
    -------------schnipp--------------------------------------
    $inhalt = file($datei);
    foreach ($inhalt as $zeile)
    {
    $zeile=eregi_replace( "<table[^>]*>", "", $zeile);
    $zeile=eregi_replace( "<tr[^>]*>", "", $zeile);
    usw.
    echo ("$zeile");
    }
    -----------------schnapp---------------------------------

    in einer oder mehreren Dateien Textpassagen verändern.
    Was macht php, wenn eine der gesuchten Textpassagen über 2 Zeilen geht?

    Das kann es nicht, weil $inhalt ein Array ist. Du untersuchst dessen Elemente und folglich die Zeilen Deiner Datei.

    Oder akzeptiert php überhaupt keinen autom. Zeilenumbruch und sieht alles als eine Zeile an, bin zum "manuellen Return"?

    Zumindest den Standard-Zeilenumbruch mit \r\n und \n erkennt es sehr gut.

    Zusatzfrage: Ist das eine gängige Lösung meines Problems oder geht das auch schneller oder effizienter?

    $file=cat $datei | sed s/'<td[.]\*>'/''/ | sed s/'<tr[.]\*>'/''/ | sed s/'<table[.]\*>'/''/;

    würde auf einem *nix-System die Datei in $file (Kein Array!) einlesen und hier die beginnenden Tags löschen. SED ist ein Zeichenstromeditor und als solcher schnell und elegant. Er ist auf den  allermeisten *nix Systemen vorhanden und rasend schnell. cat dient zur Ausgabe die hier durch mehrere (theoretisch ungenzt viele) Pipes (Rohre) jeweils zum sed geschickt und gefiltert wird.

    Vor dem cat und dem Semikolon stehen Backticks Franzosen nennen sowas accent.

    Günni

    ??? Günni ist momentan kein positiv besetzter Spitzname (google mal nach "FvG")

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. Das kann es nicht, weil $inhalt ein Array ist. Du untersuchst dessen Elemente und folglich die Zeilen Deiner Datei.

      ok.

      Zusatzfrage: Ist das eine gängige Lösung meines Problems oder geht das auch schneller oder effizienter?

      $file=cat $datei | sed s/'<td[.]\*>'/''/ | sed s/'<tr[.]\*>'/''/ | sed s/'<table[.]\*>'/''/;

      Ääh, wie meinen? :-)

      würde auf einem *nix-System die Datei in $file (Kein Array!)

      ...sondern?

      einlesen und hier die beginnenden Tags löschen. SED ist ein Zeichenstromeditor und als solcher schnell und elegant. Er ist auf den  allermeisten *nix Systemen vorhanden und rasend schnell. cat dient zur Ausgabe die hier durch mehrere (theoretisch ungenzt viele) Pipes (Rohre) jeweils zum sed geschickt und gefiltert wird.

      Ist ja der Hammer, wenns funktioniert! Probiere ich gleich morgen aus und werde sicher noch Rückfragen haben, wenn es nciht so will, wie ich will :-D

      Vor dem cat und dem Semikolon stehen Backticks Franzosen nennen sowas accent.

      Günni
      ??? Günni ist momentan kein positiv besetzter Spitzname (google mal nach "FvG")

      Nix gefunden.... Oder ist damit der Freiherr "weiß nicht mehr" gemeint?

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      Mit dankbaren Grüßen zurück

      Günther

    2. Moin!

      Ein  cat test1 | sed s/'<td[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'//;
      löschte gerade auch <td style='padding-left:1px; background-image=url(/datei);'>

      test1 ist eine Datei:

      <table border="1">
        <tr>
           <td style='padding-left:1px; background-image=url(/datei.jpg);'>Tabelle</td>
        </tr>
      </table>
      <table border="1">
        <tr>
           <td>Tabelle</td>
        </tr>
      </table>

      Ich habe natürlich alle diese Varianten probiert. sed ist beim regex manchmal etwas störrisch.

      Und um Dir eine Freude zu machen: es geht auch mit:

      $strAusgaben=$shellcommand;

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
      1. Moin!

        Ich habe den Schwierigkeitsgrad der Aufgabe nach Mudgards Hinweisen "etwas" erhöht.

        Datei test1.html:

        ---
        <table border="1"><tr><td style='padding-left:1px; background-image=url(/datei.jpg);' title=">">Tabelle1</td></tr></table>
        <table border="1"><tr><td style='padding-left:1px; background-image=url(/datei.jpg);' title=">">Tabelle2</td></tr></table>
        ---

        test.php

        <?
        $filename="test1";
        $file = cat $filename | sed s/'<td[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'// | sed s/'<tr[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'// | sed s/'<table[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'// | sed s/'<\/td>'//  | sed s/'<\/tr>'//  | sed s/'<\/table>'//;
        echo $file;
        ?>

        Es bleibt: Tabelle1\nTabelle2

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. Moin!

          Bevor es dazu fragen gibt: abgesehen davon, dass die zu filternde Datei nicht test.html, sondern, wei im Skriptschnipsel "test1" hieß, ist diese Lösung getestet.

          http://fastix.dyndns.org/test/sed/test.php (Absichtlich kein Link!)

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
          1. Hi,

            Bevor es dazu fragen gibt: abgesehen davon, dass die zu filternde Datei nicht test.html, sondern, wei im Skriptschnipsel "test1" hieß, ist diese Lösung getestet.

            Wirklich?
            Sichtbar ist zwar nur Tabelle 1 Tabelle 2 - aber im Quellcode sieht man dann doch

            <td style='padding-left:1px; background-image=url(/datei.jpg);' title=">">Tabelle 1
            Tabelle 2

            daß das td-tag nicht entfernt wurde.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Moin!

              Hi,

              Bevor es dazu fragen gibt: abgesehen davon, dass die zu filternde Datei nicht test.html, sondern, wei im Skriptschnipsel "test1" hieß, ist diese Lösung getestet.

              Wirklich?

              Es ist verrückt. Ich habe das auch gerade gesehen:

              Ich rufe es am Prompt auf, es matcht...
              Ich schaue es im Browser an: es matcht nicht.

              Ich schreibe das Ergebnis in eine Datei: es matcht.
              Ich lese die Rückgaben direkt: es matcht nicht.

              Ich habe gerade viel Spaß damit.

              Für die, die gern zusehen: http://fastix.dyndns.org/test/sed/test.php (immer noch absichtlich kein Link.)

              MFFG (Mit freundlich- friedfertigem Grinsen)

              fastix®

              --
              Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
              1. Moin!

                Es ist verrückt. Ich habe das auch gerade gesehen:

                Ich rufe es am Prompt auf, es matcht...
                Ich schaue es im Browser an: es matcht nicht.

                Ich schreibe das Ergebnis in eine Datei: es matcht.
                Ich lese die Rückgaben direkt: es matcht nicht.

                Ich habe gerade viel Spaß damit.

                Komisch: Ein Apache-Neustart (Ich hatte da versehentlich was üble-rekursives gebaut- das war aber nicht der Fehler...) und es tut in allen drei Varianten was es soll. Ich hatte außer dem verbauten Fehler nichts geändert, das Skript habe ich jetzt allerdings aufgeräumt, damit besser zu sehen ist, was "passiert".

                • Schreiben des Ergebnisses in eine Datei
                • Schreiben des Ergebnisses in eine PHP-Variable
                • Schreiben und Lesen des Befehls  in/aus einer Batch-Datei und Ausgabe in  eine PHP-Variable
                  Klappt wunderbar.

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix®

                --
                Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        2. Hi,

          <table border="1"><tr><td style='padding-left:1px; background-image=url(/datei.jpg);' title=">">Tabelle1</td></tr></table>

          background-image=? Du meinst :

          $file = cat $filename | sed s/'<td[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'// | sed s/'<tr[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'// | sed s/'<table[ A-Za-z0-9äüöß\_=-\":;.,()'']\*>'// | sed s/'<\/td>'//  | sed s/'<\/tr>'//  | sed s/'<\/table>'//;

          In den Zeichenklassen hast Du _viel_ zu wenig Zeichen (in Attributwerten können ggf. fast alle Unicode-Zeichen stehen).
          Es dürfte einfacher sein, die Zeichen anzugeben, die da nicht erlaubt sind.

          Und selbst mit Deinem Beispiel bekomm ich keine Ersetzung hin.

          Es bleibt: Tabelle1\nTabelle2

          Hm. Entweder ist mein sed kaputt oder Du hast hier nicht den benutzten Code angegeben.
          Welcher Teil Deines Codes kümmert sich denn um das > im Attribut?

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    3. Moin,

      $file=cat $datei | sed s/'<td[.]\*>'/''/ | sed s/'<tr[.]\*>'/''/ | sed s/'<table[.]\*>'/''/;

      UUOC *nitpick*
      Auszerdem macht sich das $ vor der Variable nicht gut, wenn du etwas zuweisen willst (wenn das das $ für den Commandprompt sein sollte, ist das natürlich ok).
      Und überhaupt, warum in eine Variable tun? Hasst du dein Environment wirklich so sehr? Lieber gleich in eine andere Datei: <datei1 sed ... >datei2

      --
      Henryk Plötz
      Grüße aus Berlin
      ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
      ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
    4. echo $begrüßung;

      $zeile=eregi_replace( "<table[^>]*>", "", $zeile);

      (Doch nicht) Günni: Du versuchst mit dem Konstrukt [^>]*> die Gierigkeit des Regulären Ausdrucks einzudämmen. Das gelingt dir damit auch, es gibt dafür aber eine bessere Lösung. Zum einen sollte man die Perl-kompatiblen Regular Expression Functions den POSIX-Funktionen vorziehen, da erstere mächtiger und oft auch schneller sind. Damit lässt sich die Genügsamkeit des Suchmusters mit .*?> erreichen (das Fragezeichen machts). Das ergäbe dann

      $zeile=preg_replace( "/<table.*?>/i", "", $zeile);

      $file=cat $datei | sed s/'<td[.]\*>'/''/ | sed s/'<tr[.]\*>'/''/ | sed s/'<table[.]\*>'/''/;

      fastix: Ich sehe dich des öfteren solche Shellaufrufslösungen zu posten. Ich sage mir dann immer "Das mag die Aufgabe lösen". (Nachprüfen tue ich das eigentlich nie). Aber auch "Thema verfehlt"-Gedanken kommen mir. Es geht um PHP, und nur wenn es mit PHP wirklich nicht geht, dann sollte man auch so eine Lösung in Erwägung ziehen. "Wirklich nicht geht" möchte ich so verstanden wissen, dass darin auch Performacegründe eingeschlossen sind.
      Für jemanden, der zwar PHP kennt aber keine *nix-Shell-Erfahrung hat, wird so eine Lösung schwer wart- und erweiterbar sein. Und sie läuft auch Gefahr an Safe-Mode-Einschränkungen und natürlich auch an nicht vorhandenem Betriebssystem zu scheitern.
      Ich bitte dich (selbstverständlich steht dir frei, diese Bitte auszuschlagen), so eine Lösung nur als Zusatz zu einer PHP-nativen-Variante hinzuzufügen.

      Alle: Neben der Möglichkeit, eine Datei per file() in ein Array einzulesen, gibt es ab PP 4.3.0 auch die Funktion file_get_contents(). Die leifert einen einzelnen String mit dem Inhalt der Datei zurück. Darauf lassen sich dann auch andere Funktionen zeilenübergreifend anwenden. Bei Perl-Regexp ist dabei noch der Modifizierer m (für multiline) im Anschluss an das Suchmuster anzugeben. Beispielsweise so:

      $dateiInhalt = preg_replace( '/<table.*?>/im', '', $dateiInhalt);

      Zu beachten ist, dass je nach Größe der Datei auch entsprechend Speicher verbraucht wird, und man dabei an PHPs Speicher-Limit stoßen kann.

      echo "$verabschiedung $name";

      1. Hi,

        (Doch nicht) Günni: Du versuchst mit dem Konstrukt [^>]*> die Gierigkeit des Regulären Ausdrucks einzudämmen.

        Und das ist sowieso nicht allgemein tauglich.

        <table title=">"> ist valides HTML.

        muß nicht als &gt; geschrieben werden, damit ist jeder Versuch, einfach das nächste > zu suchen, eigentlich falsch und nur dann anwendbar, wenn man sicher weiß, daß in Attributwerten kein > vorkommt.

        $zeile=preg_replace( "/<table.*?>/i", "", $zeile);

        gleiches Poblem.

        $file=cat $datei | sed s/'<td[.]\*>'/''/ | sed s/'<tr[.]\*>'/''/ | sed s/'<table[.]\*>'/''/;

        Hm. Der erste Teil würde <td>, <td.>, <td..>, <td...>, <td....> usw. ersetzen, das Zeichen Punkt hat in einer Zeichenklasse keine Sonderbedeutung, matcht also nicht ein beliebiges Zeichen, sondern nur den Punkt.
        Paßt also gar nicht zur Aufgabenstellung ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Moin!

          $file=cat $datei | sed s/'<td[.]\*>'/''/ | sed s/'<tr[.]\*>'/''/ | sed s/'<table[.]\*>'/''/;

          Hm. Der erste Teil würde <td>, <td.>, <td..>, <td...>, <td....> usw. ersetzen, das Zeichen Punkt hat in einer Zeichenklasse keine Sonderbedeutung, matcht also nicht ein beliebiges Zeichen, sondern nur den Punkt.

          Das stimmt. Deswegen steht weiter unten auch eine andere Lösung.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        2. Moin!

          Hi,

          (Doch nicht) Günni: Du versuchst mit dem Konstrukt [^>]*> die Gierigkeit des Regulären Ausdrucks einzudämmen.

          Und das ist sowieso nicht allgemein tauglich.

          Um was "allgemein taugliches zu bauen" scheint es ziemlicher Kanonen zu bedürfen:

          http://pixel-apes.com/safehtml strippt nach eigenen Angaben sämtlichen gefährlichen Code aus HTML-Dateien. Sicher lässt sich das mit einem Blick in den PHP-Quelltext auch auf Tabellen begrenzen.

          Der dort verfügbare Download umfasst gezippte 21 kb (mit php-doc-Kommentaren, also zum umbauen/weiterentwickeln) und 11 kb ohne diese.

          Weitere, teils ziemlich disperformant aussehende, Lösungsansätze, einer mit eben dem obengenannten und als nicht in allen Fällen für tauglich befundenen Suchmuster, stehen auf http://de3.php.net/manual/de/function.strip-tags.php

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
      2. Moin!

        fastix: Ich sehe dich des öfteren solche Shellaufrufslösungen zu posten.

        Ja, in der letzten Zeit beschäftige ich mich eingehender auch mit diesen Möglichkeiten.

        Ich sage mir dann immer "Das mag die Aufgabe lösen". (Nachprüfen tue ich das eigentlich nie). Aber auch "Thema verfehlt"-Gedanken kommen mir. Es geht um PHP, und nur wenn es mit PHP wirklich nicht geht, dann sollte man auch so eine Lösung in Erwägung ziehen.

        Öhm: Jein. Wir sind hier nicht in einem Seminar, Training oder einer Schulung. Ich muss mich also nicht aus kommerziellen Gründen an das Topic halten. Ich interessiere mich dafür, ob eine Löung zielgerichtet ist. Ziel ist: Da sind Daten und die will jemand so aufbereitet wissen, dass er sie als HTML oder sonstwas zum Useragent senden kann.

        Für jemanden, der zwar PHP kennt aber keine *nix-Shell-Erfahrung hat, wird so eine Lösung schwer wart- und erweiterbar sein. Und sie läuft auch Gefahr an Safe-Mode-Einschränkungen und natürlich auch an nicht vorhandenem Betriebssystem zu scheitern.

        Das sind allerdings Argumente. Übrigens auch _für_ den Einsatz von Lösungen, die Shellprogramme bieten. Manches wäre als CGI nicht nur schneller, sondern auch einfacher. (z.B. die Erzeugung von HTML/SGML/XML mittels AWK aus CSV mit vorgeschaltetem grep um nur bestimmte Datensätze zu lesen).... Hinzu kommt: Diese *nix-Tools gibts auch als nette und sehr ausgereifte GNU-Teile für Windows. Hier ist es die mangelhafte Shell, die manchmal Grenzen zieht.

        Ich bitte dich (selbstverständlich steht dir frei, diese Bitte auszuschlagen), so eine Lösung nur als Zusatz zu einer PHP-nativen-Variante hinzuzufügen.

        Halt mal: Verbiete ich etwa irgendjemanden seine PHP-native Variante ebenfalls hinzuzufügen? Wenn ich meine Lösung vorstelle, dann beeinhaltet das keineswegs ein Verbot an Dritte ebenfalls eine Lösungsmöglichkeit mit PHP zu zeigen. Dies ist ein Forum und hier herrscht Meinungsvielfalt. Jede einzelne Meinung und Lösung trägt zur Meinungs- und Lösungsvielfalt bei. Und ich sehe nicht, warum ein Teilnehmer immer einen kompletten Sack möglicher Lösungen posten soll, wenn es denn auch andere gibt, die, wie Du auch, ebenfalls gerne und fundiert helfen.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development