Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 30

Thema: Script-Frischling und komplexer suchen/ersetzen-Script

  1. #1
    Gast

    Question Script-Frischling und komplexer suchen/ersetzen-Script

    Der Autor hat in ein HTML-Eingabefeld längeren HTML-formatierten Text eingetragen. Jedes enthaltene HTML-Tag soll eine im Algorithmus bekannte Script-action auslösen.

    Der Einstieg will einfach nicht gelingen. Zunächst muss der Text durchsucht werden. Es wird also wohl in einer Schleife nach dem String "<*>" gesucht werden müssen? Beim Auffinden wird dann der genaue String ermittelt und mit einer Variablenliste verglichen.

    Die Variablen könnte man alle in eine switch-Anweisung packen. Jeder case-Zweig enthält dann die auszuführende Befehlsfolge. Die default-Anweisung hätte die Aufgabe, das Tag zu löschen.

    Wer kann etwas Start-Schützenhilfe geben oder gar was ausarbeiten, das wir dann ergänzen?

    -- Ja ja , es ist für die Infiserver-db. Ich hab blackbird die (soweit ich konnte) verfollständigte und korrigiert Aufgabenliste (s. Mitgliederforum) gemailt - das meiste ist so geblieben. Gönnt ihm Schwimmbad und Grillabend . Er wird sich melden, sobald er die HP-Seite aktualisiert hat...

    without Sonnenbrand

    Bernhard

  2. #2
    blackbird
    Gast

    Post

    hi omegaX!

    du irrst dich, gleich 2mal ich meld mich bevor ichs aktualisiert hab (ist aber schon in vorbereitung) und ich bin leider nicht beim schwimmen, wir haben heut fenster gestrichen..

    aber sonst kann ich ihm nur zustimmen! wir brauchen leute die mit perl gut umgehen können und ein php-ler wär auch ned verkehrt..
    genaures gibts hier im mitgliederforum im thread zum linuxinfoserver oder unter http://www.dumdidum.de/linuxinfo.html

    grüsse blackbird

  3. #3
    Gast

    Cool

    Ist Masuchist ein Lehrberuf ? Muss doch gleich mal die Seite wieder laden. Vielleicht hat sich was neues ergeben?

    Grüsse

    Bernhard

  4. #4
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Hier mal als Schützenhilfe:

    Code:
    # Array of Text
    @Text = ();
     
    sub SearchText($Str)
    {
    $Str = shift;
     
      foreach (@Text)
      {
      my $Line = $_;
      
        if ( /.*?(\&lt;$Str\&gt; ).*/ )
          { return $1; }
      
      }
    
      return '';
    }
    Nur simple, aber so als Suchfunktion brauchbar...
    @Text muß natürlich den Text enthalten und $Str den Suchstring (ohne &lt;&gt; ).
    Man könnte auch die Zeilen-Nr. (bzw. den Text-Array Index) zurück geben, statt des Textes und diesen dann weiter verarbeiten...

    Gruß

    Robert

  5. #5
    Gast

    Post

    Der Trost: Das habt Ihr Spezialisten auch nicht in wenigen Wochen gelernt .

    Dank Dir, Robert

    Also, der Text muss als erstes eingelesen und an @Text übergeben werden. Da bräuchten wir noch was.

    Vom Suchstring ist zunächst nur bekannt, dass er aus den beiden &lt;&gt; besteht und n noch unbekannte Zeichen enthält. Sobald solch ein Suchstring gefunden wird, wird er mit den Mustern verglichen. (Die Gross-und Kleinschreibung muss noch geklärt werden).

    Die String-Operation muss sicher auch auf die Klammern durchgeführt werden. Die eigenen Tags veranlassen ja oft mehrere Operationen. Bei Löschungen sollen auf jeden Fall die Klammern mitgelöscht werden. -- Da Du die Klammern maskierst, könnten sie doch auch sicher Bestandteil von $Str sein?

    Ist das jetzt Perl? Befehle wie foreach und konstante Variablen wie $Line hab ich in den Tutorials gar nicht entdeckt. Muss mir wohl doch so 'nen richtigen Perl-Wälzer zulegen.

    Ist auf jeden Fall gut, dass die Funktion auch andere Parameter aus dem Text zurückliefern kann. Die Schnittstelle zur db kommt ja noch...

    Brumm. Jetzt hab ich was leckeres und steh doch ganz am Anfang. Logo, ich hab mich im Moment viel zu weit vorgewagt. Aber egal, es soll ja weitergehen .

    Gruss

    Bernhard

  6. #6
    Registrierter Benutzer
    Registriert seit
    09.10.1999
    Beiträge
    61

    Smile

    Hi

    Ich mach gerade hardcoreprogrammieren *ggg*
    C, Perl und C++ Windows Programmierung, Java parallel
    Studium steßt ganz schön.
    Aber ich habe mir Roberts kleine Funktion auch mal vorgenommen und versucht sie in eine
    automatische Ersetzungsroutine einzubauen.
    Aber ich bin in Perl doch noch nicht so fit.
    Und er schmeißt mir immer Fehlermeldungen an den Kopf :-(
    Deshalb meine Frage was erwartet @Text ? (ein Feld in einer Dimension beliebiger Länge mit allen Zeichen)?
    Bin Dankbar für jede Erläuterung.

    Wenn ich Perl weiter bin wollte ich eine Funktion programmieren die den Gesammten Inhalt
    eines Verzeichnisses nach html durchsucht und die Dateien mit der Modifikation wieder abspeichert.
    Ist das für uns von Nutzen ?

    Bernhard ich hatte heute noch ne Web Adresse aus der Schweitz mit einen in deutsch gehatenen Tutorial.
    Der Vorteil hier, bei weiteren Infos wird auf die umfangreichen englischen Perlpages verwiesen.
    Ich werde, Die Adresse Noch mal heraussuchen und posten.

    Bücher "OReily, Lerning Perl 2nd Edition "oder so änhlich
    -in englisch, aber sehr gut für die Anfänge.

    hihi : - brauchte nicht suchen, habe gerade noch einen Ausdruck gefunden und hier die ulr: http://www.fhzh.ch/bereich-technik/l...erl_start.html
    dort steht auch my beschrieben.
    usw.

    Gruss
    Christoph

  7. #7
    Gast

    Question

    Hi Christoph

    Da hast Du ja volles Programm. Kein Wunder, dass es in Deiner Ecke so still ist (abgesehen von gründlichen Recherchen zu Grafikkarten und Einfriermäusen ).

    Mein Tutorial war wirklich nur für den ersten Einstieg. Deine URL kommt da gerade richtig. Schon beim Laden hab ich Stringoperationen, foreach usw. entdeckt. Damit sollte ich weiterkommen.

    > was erwartet @Text ?
    Ich denk mal sowas in der Art:
    @Text=("Damit sollte sich eigentlich schon arbeiten lassen");
    Wir müssen aber in einer Variablen, also im Funktions-Return übergeben -> Ein Programm liest den String ein und übergibt in einer bestimmten Form. Genau diese Form ist dann in die Funktions-Klammern zu übernehmen.

    Analog hierzu übergibt Robert in der Variablen $1.

    Schlagt einfach, wenn es nicht stimmt. Aber um das umsetzen zu können, fehlt mir einfach noch die Programm-Kenntnis. Ohne die geht gar nichts.

    Die Funktion, die Du programmieren willst, ist top. Sowas wird bei vielen Anlässen gebraucht. Angenommen, Du hast eine Anzahl HTML-files erstellt. Nun fällt Dir ein, Du willst mit CSS arbeiten... Muss ich weitersprechen? Wir werden die Funktion im Projekt gut zum Einsatz bringen können.

    Also: Wer kann eine Funktion beisteuern, die aus einem Textfeld den String einliest und diesen in einer Variablen übergibt?

    Ole, good learn, good hacks

    Bernhard

  8. #8
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Hallo!


    Code:
    @DerText = ();
    $FoundLine = -1;
    $DateiName = "/tmp/meinedatei";
     
    # Datei öffenen und bei Fehler Programm mit Fehlermeldung verlassen...
    open(IFILE, "<$DateiName") | | die "Fehler beim öffnen von $DateiName\n";
    # Datei-Text an Array DerText übergeben...
    @DerText = &lt;IFILE&gt;;
    close(IFILE);
    $TextZeile = &SearchText;
    if ( $TextZeile )
    {
      #mach was damit...
    }
    # Falls wir noch mal suchen wollen, Index wieder initilisieren...
    $FoundText = -1;
    # etc. pp.
     
    ###################
     
    sub SearchText()
    {
      # Zeile für Zeile (oder Index für Index) aus DerText bearbeiten
      foreach (@DerText)
      {
      my $Line = $_;
     
        # Wir zählen mal den Index der gefundenen Zeilen mit (Array immer ab Index NULL !!!)
        $FoundLine++;
        # Jetzt schreib ich es mal etwas ausführlicher und lesbarer...
        if ( $Line =~ m/.*?(\<.*?\>).*/ )
        {
          # $1 enthält das, was zwischen den () Klammern gefunden wurde.
          return $1;
        }
      }
     
      return '';
    }
    Kurze Anmerkung:
    Ich könnte bei foreach auch folgendes schreiben.

    foreach $Line (@DerText)

    Aber da ich selber dann auch immer den Fehler mache, das ich evtl. $Line direkt bearbeite (was dann DIREKT im Array ist, den so wäre $Line eine DIREKTE Referenz zu dem Eintrag in @DerText), habe ich lieber aus $Line eine eigene locale Variable gemacht und übergebe dieser den jeweiligen Eintrag (my $Line = $_).
    Zweites Problem ist natürlich die IF-Anweisung bei foreach. SO wird in einer Zeile nur der 1. TAG gefunden. Aber man kann es erweitern, daß man die Zeile vollständig bearbeitet bis alle TAG's gefunden werden.
    Es wird auch nicht berücksichtigt, daß evtl. der TAG über mehrere Zeilen gehen könnte!

    Übrigens, das hier so 1:1 übernehmen und ausführen wird nicht klappen. Es ist nur ein Beispiel an dem noch einges erweitert werden muss.

    Gruß

    Robert


    [Diese Nachricht wurde von robert am 16. Mai 2000 editiert.]

  9. #9
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Nachtrag...

    Beim suchen wäre folgendes wohl noch besser:

    Code:
    m/.*?(\b\<.*?\>).*/
    \b bedeutet an einem Wortanfang (Wort darf man hier natürlich nicht so wörtlich nehmen... )

    Robert

  10. #10
    Gast

    Cool

    Mal so zwischendurch.

    Die Funktion kann unterscheiden, ob sie Tags findet oder nicht.

    ...
    if ( $TextZeile )
    {
    &nbsp;&nbsp;&nbsp;print "\n$1\n\n" ;
    }
    &nbsp;else
    &nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;print "\n Die Datei $DateiName enthält keine Tags.\n\n";
    &nbsp;}
    ...

    Das ist schon mal gut. Ich konnte sie noch nicht ausgeben lassen, was sie gefunden kat. Also weiterknobeln.

    > m/.*?(\b\<.*?\>).*/
    Bin noch nicht sicher, ob \b immer zum Ziel führt. Oft sind Tags direkt aneinander gehängt. Aber erst mal will ich rausfinden, was $1 überhaupt beinhaltet. Ich muss ja was konkretes sehen, um weiterarbeiten zu können.

    Dank Dir Robert für diese leckere "Sprengkapsel". Ohne wäre lange Zeit gar nicht möglich gewesen. Soviel steht fest.

    Christoph, ganz leckeres Tutorial. Scheint für Lehrzwecke geschrieben zu sein. Es befasst sich speziell mit der String-Manipulation. Der Text ist kompakt und verständlich. Es werden gezielt und dosiert auch englische Ausdrücke mit reingemischt. Von der Art gibt es sicher mehr. Sowas ist immer eine prima Referenz für die Linkliste. --

    -- Wo ist die Db? Ich hab hier 10 MB Stoff auf der Platte. Das Zeug muss doch irgendwann mal aufgearbeitet werden. Bis Weihnachten kann ich nicht weitersammeln bei den vielen super Beiträgen. Irgendwann muss ich aufhören zu speichern. Die Foren-Suchmaschine werde ich später nicht mehr bedienen. ... Also... es werden noch viele kurztipfreudige, hackwütige, zeitverfügbare Hände benötigt. Müssen wir uns die jetzt in anderen Foren zusammensuchen ?

    Bis zum nächsten Treffer (egal, wer ihn findet)

    Bernhard

    [Diese Nachricht wurde von Omega-X am 17. Mai 2000 editiert.]

  11. #11
    Registrierter Benutzer
    Registriert seit
    09.10.1999
    Beiträge
    61

    Wink

    Hi

    Leutz

    Mein Kopf raucht ... Perl Perl Perl Perl RegExpresions Gr.... wer hilft mir ?
    Robert Deine Regexpressions verstehe ich nicht so ganz m/.*?(\<.*?\>).*/ Hä ???
    wieso Quittiert mir mein perl Programm die
    Zeile immer mit ner Fehlermeldung.
    Ansich habe ich die Regexpressions schon Verstanden. Aber was macht der Ausdruck ?
    gibts unterschiede bei verschiedenen Compilern ? Ich stelle nämlich gerade Fest
    unter Linux @Home funktioniert es.
    Warum nicht auch auf der Unixkiste in der Uni.

    Das ist schon Seltsam. Vielleicht klappt's
    jetzt mit Linux.
    Wenn ich das Programm so habe wie ich es mir vorgestellt habe poste ich es hier.

    Gruss
    Christoph



  12. #12
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Hallo Christoph,

    laß den Kopf nicht rauchen. Ist wohl meine Schuld!

    Die Anweisung

    .*?

    wird von älterem Perl nicht verstanden, ist eher eine Neuerung (aber schon bei 5.04).
    Laß mal die Versions-Nummer von Perl auf der Uni raus, daran könnte es liegen.

    .*

    bedeutet kein oder beliebig viel Zeichen, dies können aber auch ALLE sein!

    .*?

    grenzt dies etwas ein und sagt Perl es soll nicht so gierig sein und nur beliebig viele, aber nicht unbedingt alle Zeichen nehmen, wenn danach noch nach etwas anderem gesucht wird.

    Siehe auch in "Programmieren in Perl", zweite (deutsche) Auflage, Seite 31/32.

    Gruß

    Robert

    P.S.
    Übrigens, als gutes Einsteiger-Buch in Perl würde ich lieber "Einführung in Perl" (Randal Schwarz), ebenfalls von O'Reilly, empfehlen.

  13. #13
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Bernhard,

    vorsicht!
    Die $1 bezieht sich nur direkt auf das, was vorher in der RE gesucht wurde.
    Soll heißen, die Klammern sind eine Art "Markierung" dafür, daß das was dazwischen gesucht/gefunden wurde, in der Variable $1 gespeichert wird.
    Wenn du in der RE jetzt mehrere Klammern hast, wird von Links nach Rechts die Inhalte der Klammer-Markierungen in den Variablen $1..$n gespeichert. Dies ist aber nicht bei der Rückkehr der Funktion gesichert!!!
    Du kannst statt $1 auch \1 als Backreferenz benutzen. Aber ich habe mir in Perl das $1 angewöhnt, da es besser in Perl paßt.
    Wenn du eine Backreferenz aber direkt in der Suche benutzen willst, MUSST du sogar \1..\n nehmen!

    Beispiel
    m/\d*(\w*) \1/

    Soll heißen, schaue, ob am Anfang keine oder beliebig viel Zahlen stehen (\d*) und merke dir danach (dafür die Klammern), wenn es vorkommt, ob kein oder beliebig viele Alpha-Numerische Zeichen (inkl. Unterstrich) vorkommen (\w*) und benutze diese gefundenen Alpha-Numerischen Zeichen nach dem nächsten Leerzeichen wieder als Such-String (Backreference = \1).
    In diesem Fall MUSS man wie gesagt \1 als Backreference nehmen und darf nicht $1 benutzen.
    Backreferences sind auch praktisch um einen String durch einen enthaltenen Teil-String zu ersetzen.
    Beispiel:

    Code:
    $TestString = 'Dies ist ein Test für Backreference';
     
    $TestString =~ s/.* (\bTest).*/$1/
     
    print $TestString, "\n";
    Und? Was kommt da bei raus???

    Wenn man direkt nach Klammern suchen will, muß man diese mit Backslash als Meta-Zeichen maskieren.

    /\(.*\)/

    Bei SED ist es wiederum anders, da muß man die Klammern mit Backslash maskieren, wenn man sie als Backreferens einsetzt.
    Das hat mich am Anfang ganz schön durcheinander gebracht und ich habe es immer verwechselt...

    Wenn du also oben nach dem Funktionsaufruf die Zeile bearbeiten willst, benutze die Index-Variable $FoundLine. Deshalb hab ich sie vorrausschauend hinzugefügt!

    Code:
    if ( $TextLine )
    {
      $ValueText = $DerText[$FoundLine];
    
      # Mach was mit $ValueText...
    }
    else
    {
     print 'Nix gefunden', "\n";
    }

    Gruß

    Robert

    [Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]

    [Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]

  14. #14
    Gast

    Cool

    Haue, Haue, Haue - kein Wunder, dass sich da nur Script-Frischlinge (noch ahnungslos) und Spezialisten drantrauen. Spätestens nach Deinen Erklärungen lernt man Respekt. Die gehen aber auch schon satt ins Eingemachte.

    Mir raucht der Kopf nicht vom Denken (das kommt erst allmählich mit rein), ich krieg den Drehwurm vom schnellen Probieren . Die Änderungen sind minimal und die Durchläufe blitzschnell. Und immer wieder was aus dem Tutorial nachvollziehen...

    Hat jemand gesagt, C++ ist schwer? Kann gar nicht sein. Zumindest nicht, solange man sich halbwegs im "behüteten" Rahmen der Bibliotheken bewegt .

    War jetzt echt Erholung, die paar Zeilen mal linear durchzuschreiben.

    Und weiter geht's...

    Bernhard

    PS. Halt, nach dem Speichern erst mal wieder suchen/ersetzen spielen. Kfm ignoriert &lt;BR&gt; innerhalb von &lt;PRE&gt; . Irgendwann muss der Nachfolger doch fertiggebacken sein. Ich mag das Teilchen .

  15. #15
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Christoph,

    jepp... split ist die Lösung.

    Beispiel:

    In einer Text-Datei steht folgendes.

    hans=ingo
    jürgen=bernhard
    robert=stefan

    Wenn du dies jetzt, wie oben beschrieben, öffnest und an ein Array übergibst, enthätl jeder Array-Index eine Zeile.
    Dann kannst du es wie folgt machen.

    Code:
    @SuchMich = ();
    $MeineDatei = "/tmp/meinedatei";
     
    open(INFILE, "< $MeineDatei") | | die "Konnte nicht öffnen\n";
    @SuchMich = &lt;INFILE&gt;;
    close(INFILE);
     
    foreach (@SuchMich)
    {
    my ($Name1, $Name2) = split( /=/, $_);
     
     print "Name 1: $Name1 gleich Name 2: $Name2\n";
    }
    Übrigens, der 1. Parameter von split ist auch nur eine RE!!!


    Bernhard,

    wußtest du, daß Perl angelehnt an der deutschen Sprache und deren Gramatik entwickelt wurde?
    Perl ist sehr vielseitig und es gibt da einen "Spruch" zu Perl, schon fast ein Klassiker.

    TMTOWTDI = There's More Than One Way To Do It !

    Von Larry Wall

    Gruß

    Robert


    [Diese Nachricht wurde von robert am 18. Mai 2000 editiert.]

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •