Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Hilfe bei regulärem Ausdruck

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Hilfe bei regulärem Ausdruck

    Hallo,

    ich habe folgendes Problem, ich habe Text, möchte in diesem Text . [A-Z] ersetzen durch .\n[A-Z]. Ansich ganz einfach, aber wie kann ich es erreichen, daß nur der . ersetzt wird, aber nicht der Anfangsbuchstabe des darauffolgenden Wortes?

    Code:
    $zeile_1 = ereg_replace('[.][ \t][A-Z]', "\n", $zeile);
    So wird die richtige Stelle gefunden, aber die Ersetzung ist falsch. Es wird die gesamte Zeichenkette ersetzt, das geht aber nicht, der erste Buchstabe muß erhalten bleiben, es besteht aber auch keine andere Möglichkeit der Suche nach dem Punkt, da Punkte auch an anderen Stellen vorkommen.

    Grüße Matthias


  • #2
    hmm,

    du kannst
    1. den ersten buchstaben im pattern in ( ) setzen, ihn im ersatz als backreference mit angeben
    2. mittels assertion
    Code:
    foo(?=bar)
    danach suchen. sucht nach foo, gefolgt von bar ... als match erhälts du aber nur foo, ohne bar ... somit sollte auch beim replace nur foo ersetzt werden ...

    bezogen auf preg_...

    Kommentar


    • #3
      Danke

      das hat erstmal weitergeholfen.

      Jetzt habe ich ein neues Problem, ich finde nicht das Ende der Zeile. Der Text sieht so aus (Die Zahlen sind Zeilennummern):
      1 %Editors=M. Allard & B
      2 Lefebvre (Eds.), Le musée au service de la personne/The museum as service to people (pp. 285-289)

      Ich will, das hinter dem B der Zeilenumbruch durch '. ' ersetzt wird und somit Zeile 2 hinten angehangen wird. Bisher versuche ich erstmal nur Test anzuhängen, aber es wird immer vor das '&' geschrieben?

      Code:
      preg_replace('/(?=[&][ \t][A-Z])[\n]/', "test", $zeile5);
      Grüße Matthias

      Kommentar


      • #4
        Re: Danke

        Ich will, das hinter dem B der Zeilenumbruch durch '. ' ersetzt wird und somit Zeile 2 hinten angehangen wird.
        kannst du dein anliegen mal allgemeiner formulieren? willst du jeden zeilenumbruch durch . ersetzen?

        aber es wird immer vor das '&' geschrieben?
        ja, so hast du es festgelegt ... suche nach 'nichts', das von etwas gefolgt wird, und ersetze es durch test ...

        Kommentar


        • #5
          Ich versuche es mal allgemeiner.

          Ich habe eine Textdatei mit Literaturangaben:

          z.B. so

          Abler, T. (196. Traffic patterns and exhibit design: A study of learning in the museum. In S. D. Borheghyi & I. Hanson (Eds.), The museum visitor, Publication in museology: No. 3 (pp. 103-141). Milwaukee, WI: Milwaukee Public Museum.

          Die soll umsortiert werden, dazu muß zuerst nach jedem Punkt (der ein Feldtrenner ist) ein Umbruch eingefügt werden und der Punkt soll gelöscht werden, d.h. z.B. nach Abler, T. darf kein Umbruch erfolgen.

          Am Beispiel:
          Abler, T. (196.
          Traffic patterns and exhibit design: A study of learning in the museum.
          In S. D. Borheghyi & I. Hanson (Eds.), The museum visitor, Publication in museology: No. 3 (pp. 103-141).
          Milwaukee, WI: Milwaukee Public Museum.

          Die relevanten Punkte finde ich raus, indem ich nach '. [A-Z]' suche, Problem dabei, er trennt teilweise falsch, im Beispiel:

          In S. D. Borheghyi & I
          Hanson (Eds.), The museum visitor, Publication in museology: No. 3 (pp. 103-141).

          Ich wollte jetzt einfach nur diese eine Zeile nochmal "behandeln", indem ich nach '^In [gefolgt von irgendwas in beliebigerLänge][&][ \t][A-Z]\n' suche und den Zeilenumbruch ersetzte durch '. '.

          Wenn ich die Datei mit einem Editor anschaue ist da ein klarer Zeilenumbruch, aber wenn ich die [\s] oder [:space:] nehme, wird nichts gefunden.

          Ich taste mich halt gerade langsam ran an regexp, Grüße und Danke für deine Hilfe Matthias

          Kommentar


          • #6
            eventuell hilft dir das hier noch etwas weiter:
            http://www.tutorials.de/showthread.php?t=176625
            privater Blog

            Kommentar


            • #7
              tja. das ist ja alles schön und gut. wenn ich durchsuchen lassen möchte was vorhanden sein MUSS dann geht das ja gut. nur was mache ich wenn ich etwas suche möchte das NICHT vorhanden sein darf. muss ich dann wirklich ALLE möglichkeiten die es gibt eingeben?

              also in meinem script soll man nur a-z (egal ob gross oder klein), 0-9 und die zeichen - und _ verwenden dürfen. muss ich jetzt ALLE anderen ausschliessen? denn mit folgender variante funktioniert es schon, nur kann ich, sobald ich einen buchstaben oder eine zahl eingebe auch sämtliche andere sonderzeichen miteingeben ohne dass eine fehlermeldung kommt:

              PHP-Code:
                  if(!eregi('[a-z_0-9]'$reg_username)) {
                      
              $error_username 'Falsche Zeichen!';
                      
              $error_registration true;
                  }; 
              und das mit dem - funktioniert hier auch nicht. *argl*
              mfg Alex

              Kommentar


              • #8
                noch ein Problem

                Hei,

                ich bin jetzt doch schon ganz gut weitergekommen, aber jetzt hängt es mal wieder.

                Ich will an Ende dieser Zeile (und alle anderen die mit %Series anfangen):
                %Series=The museum visitor, Publication in museology: No. 3 (pp. 103-141)
                einen Zeilenumbruch und %Address= einfügen.

                Ich versuche das mit

                Code:
                   $zeile12 = preg_replace('/(?=%Series=.*?)[\n]/',"test=",fgets($fr1));
                Aber es geht nicht und ich finde nicht raus, warum.

                Grüße Matthias

                Kommentar


                • #9
                  regexp:
                  Code:
                  /(%Series.+)$/im
                  ersatz:
                  Code:
                  \1\r\n%Address=

                  Kommentar


                  • #10
                    Hei,

                    Zitat von derHund
                    regexp:
                    Code:
                    /(%Series.+)$/im
                    ersatz:
                    Code:
                    \1\r\n%Address=
                    das geht leider nicht, ich will nicht alles ersetzen, sondern anhängen. Mein Problem ist es, daß Ende der Zeile zu finden und dort etwas anzuhängen. Ich finde die gesamte Zeile, ich weiß auch, wie ich die Zeile erhalten kann. Aber wie kann ich den (im Editor deutlich sichtbaren) Zeilenumbruch am Ende der Zeile austauschen gegen \n%Address? Wenn ich an den regexp [\n] anhänge wird die betreffende Zeile nicht mehr gefunden, dasselbe gilt für [:space:].

                    Grüße Matthias

                    Kommentar


                    • #11
                      Zitat von Promaetheus
                      tja. das ist ja alles schön und gut. wenn ich durchsuchen lassen möchte was vorhanden sein MUSS dann geht das ja gut. nur was mache ich wenn ich etwas suche möchte das NICHT vorhanden sein darf. muss ich dann wirklich ALLE möglichkeiten die es gibt eingeben?

                      also in meinem script soll man nur a-z (egal ob gross oder klein), 0-9 und die zeichen - und _ verwenden dürfen. muss ich jetzt ALLE anderen ausschliessen? denn mit folgender variante funktioniert es schon, nur kann ich, sobald ich einen buchstaben oder eine zahl eingebe auch sämtliche andere sonderzeichen miteingeben ohne dass eine fehlermeldung kommt:

                      PHP-Code:
                          if(!eregi('[a-z_0-9]'$reg_username)) {
                              
                      $error_username 'Falsche Zeichen!';
                              
                      $error_registration true;
                          }; 
                      und das mit dem - funktioniert hier auch nicht. *argl*
                      Nö, musst Du nicht, Du kannst negative Zeichengruppen angeben (und ich bevorzuge preg, sollte aber egal sein):

                      PHP-Code:
                      <?php

                      if (preg_match ('/[^a-z0-9_-]/i'$reg_username)) {
                          
                      $error_username 'Falsche Zeichen!';
                          
                      $error_registration true;
                      }

                      ?>
                      Cheers, Marco

                      Kommentar


                      • #12
                        das geht leider nicht,
                        doch, ich habe es ausprobiert
                        ich will nicht alles ersetzen, sondern anhängen.
                        dazu die backref \1
                        Mein Problem ist es, daß Ende der Zeile zu finden
                        dazu die kombination aus $ und modifier m

                        poste eventuell nochmal einen beispieltext, und das gewünschte ergebnis, ... wenn du sagst, am ende der zeile einen zeilenumbruch einfügen, weiß ich nicht, ob du im endeffekt zwei oder einen zeilenumbruch haben willst, weißt?

                        Kommentar


                        • #13
                          Hei derHund.

                          ich habe es jetzt nochmal probiert. Ich habe aus deinem Vorschlag /i rausgenommen, groß/Klein muß unterschieden werden (liege ich richtig?), außerdem hab ich aus "\r\n" "\n" gemacht (ich arbeit unter linux, liege ich richtig?). Im php Skript steht folgendes:

                          PHP-Code:
                          $zeile12 preg_replace('/(%Series.+)$/m'"\1\n%Address=",fgets($fr1)); 
                          Es stimmt, die Zeile wird gefunden , es wird auch %Address in der nächsten Zeile eingefügt . Aber der backref\1 funktioniert nicht. Anstelle der gewünschten Zeile (%Series=The museum visitor, Publication in museology: No. 3 (pp. 103-141)) erscheint '^A'.

                          poste eventuell nochmal einen beispieltext, und das gewünschte ergebnis,
                          Aus:
                          %Series=The museum visitor, Publication in museology: No. 3 (pp. 103-141)

                          soll

                          %Series=The museum visitor, Publication in museology: No. 3 (pp. 103-141) [ENTER]
                          %Address=

                          werden.

                          Dank dir schonmal, Grüße Matthias

                          ***EDIT***

                          Ich glaub ich habs gefunden, man muß statt '\1' '$1' als backref schreiben.

                          Kommentar


                          • #14
                            ja, oder \\1, hängt afaik von den quotes ab ...

                            na, zumindest gehts ...

                            Kommentar

                            Lädt...
                            X