Zeichenkette zwischen zwei bestimmten Ausdrücken ersetzen

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

  • Zeichenkette zwischen zwei bestimmten Ausdrücken ersetzen

    Hallo,

    ich habe folgendes Problem. In einer XML-Datei steht z.B.

    <ShipmentActualWeight> 0.1</ShipmentActualWeight>

    (Das kann auch mehrmals vorkommen)

    Hier soll einfach die 0.1 in 0,1 geändert werden und das
    XML-File wieder abgespeichert werden.

    Ich hab das bewußt bei PHP gepostet, weil ich auf dem Server
    später kein DOMXML zur Verfügung haben werde.

    Bisher mache ich folgendes:

    PHP-Code:

    $file 
    'einedatei.xml';

    if (isset(
    $_POST['txt'])) {

    $handle fopen ($file'r+');
    $neu=stripslashes($_POST['txt']);
    $neu=str_replace("."","$neu);

    fwrite ($handle$neu);
    fclose ($handle); 

    }

    readfile($file);

    ?>
    </textarea>
    <input type="submit" value="save">
    </form> 
    Das ist natürlich nicht ganz Sinn der Sache, weil er mir hier ja ALLE . in , ändert.

    Mit regulären Ausdrücken kenne ich mich nicht so aus, aber ich hab mal geschaut, wie man es mit preg_match lösen könnte. In den Beispielen habe ich immer nur Sachen gefunden, die mir ein (oder mehrere) gefundene/s Zeichen ersetzen.

    z.B. preg_replace("!\[b\](.*?)\[/b\]!","<b>text</b>",$str);

    Ich bräuchte aber etwas, was mir

    a) ausliest, was zwischen <ShipmentActualWeight> und
    </ShipmentActualWeight> liegt

    und

    b) diesen Inhalt dann auf einen Punkt überprüft und in ein Komma ändert, soweit vorhanden.

    Ich denke Punkt b ist sicher das kleinste Problem...

    Wenn das eine kompliziertere, aufwändigere Sache ist, dann sagt es bitte gleich, dann laß ich die Finger davon. Wenn es tatsächlich "nur" ein paar Parameter im Pregmatch sind, würde ich mich über etwas Hilfe freuen!

    Vielleicht liege ich mit meinem Ansatz ja auch völlig daneben?

    Danke schonmal und Grüße,
    Coni
    Gruß, Coni
    ~~ codito ergo sum - ich code, also bin ich! ~~

  • #2
    PHP-Code:
    $string preg_replace('|(<ShipmentActualWeight>)( 0.1)(</ShipmentActualWeight>)|U'"${1}0,1$3"$string); 
    Zuletzt geändert von H2O; 12.02.2008, 16:23.
    Gruss
    H2O

    Kommentar


    • #3
      Befinden sich alle Vorkommen von 0.1 zwischen solchen Tags? Sprich müssen alle Vorkommen von 0.1 ersetzt werden? Wenn ja dann mach es mit str_replace()...

      Gruss

      tobi
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        Ok, ich hab den Beitrag zuerst zuwenig genau gelesen, aber so sollten alle Fälle abgedeckt sein:
        PHP-Code:
        $string preg_replace('|(<ShipmentActualWeight>)(\d*).(\d+)(</ShipmentActualWeight>)|U'"$1$2,$3$4"$string); 
        Falls es sich dabei aber um einen Dezimalpunkt handelt, würde ich dir empfehlen, den stehen zu lassen. Den Punkt versteht jeder, das Komma ausserhalb Deutschlands kaum einer.
        Gruss
        H2O

        Kommentar


        • #5
          Original geschrieben von H2O
          PHP-Code:
          $string preg_replace('|(<ShipmentActualWeight>)( 0.1)(</ShipmentActualWeight>)|U'"${1}0,1$3"$string); 

          Hm, danke, das gibt mir schonmal die 1.5 aus, ersetzt aber noch nichts - soll ich das so machen, wie oben?

          Was macht |U und "${1}0,1$3"?
          Hab gelesen, daß das $-Zeichen die Zeichen von hinten zählt, aber ich verstehe trotzdem nicht ganz, was das bewirkt...

          Grüße,
          coni


          EDIT:

          Moment, muß mir Deinen zweiten Post kurz noch zur Gemüte ziehen...


          Gruß, Coni
          ~~ codito ergo sum - ich code, also bin ich! ~~

          Kommentar


          • #6
            Original geschrieben von jahlives
            Befinden sich alle Vorkommen von 0.1 zwischen solchen Tags? Sprich müssen alle Vorkommen von 0.1 ersetzt werden? Wenn ja dann mach es mit str_replace()...

            Gruss

            tobi
            Ja, der Haken ist, daß ich nicht weiß, WAS zwischen den TAGs steht.
            Es kann auch 1.5 oder 22.4 drinstehen.
            Gruß, Coni
            ~~ codito ergo sum - ich code, also bin ich! ~~

            Kommentar


            • #7
              Original geschrieben von H2O
              Falls es sich dabei aber um einen Dezimalpunkt handelt, würde ich dir empfehlen, den stehen zu lassen. Den Punkt versteht jeder, das Komma ausserhalb Deutschlands kaum einer.
              Ja, ist ein Dezimalpunkt und ist mir auch bewußt.
              Aber das Programm, das nachher die XML-Datei fressen soll, versteht leider den Punkt nicht, sondern nur ein Komma, da kann ich nichts ändern.
              Gruß, Coni
              ~~ codito ergo sum - ich code, also bin ich! ~~

              Kommentar


              • #8
                Hm, der Punkt bleibt hartnäckig drin:

                PHP-Code:
                <?PHP


                $test
                ="<ShipmentActualWeight>1.5</ShipmentActualWeight>
                <dsdv />
                <ShipmentActualWeight>2.8</ShipmentActualWeight>
                "
                ;
                echo 
                $test."<br><br>";
                //$str = preg_replace("!-anfang-(.*?)-ende-!","<anfang>$1<ende>",$str);
                $test preg_replace('|(<ShipmentActualWeight> )(d*).(d+)(</ShipmentActualWeight> )|U'"$1$2,$3$4"$test);

                echo 
                $test;
                ?>
                Gibt aus:

                <ShipmentActualWeight>1.5</ShipmentActualWeight>
                <dsdv />
                <ShipmentActualWeight>2.8</ShipmentActualWeight>
                <br><br><ShipmentActualWeight>1.5</ShipmentActualWeight>
                <dsdv />
                <ShipmentActualWeight>2.8</ShipmentActualWeight>

                Versteh ich nicht...
                Gruß, Coni
                ~~ codito ergo sum - ich code, also bin ich! ~~

                Kommentar


                • #9
                  Hm, der Punkt bleibt hartnäckig drin:
                  Hast du den Punkt im Suchmuster auch so geschrieben \. ?
                  . in einem Suchmuster heisst sonst jedes Zeichen
                  EDIT:

                  Der RegExp funzt überigens 1A
                  http://regexp-evaluator.de/evaluator...605d/#ergebnis

                  Zuletzt geändert von jahlives; 12.02.2008, 17:03.
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Krass!!!
                    Jetzt funzt es!

                    PHP-Code:

                    (<ShipmentActualWeight>)(\d*)\.(\d+)(</ShipmentActualWeight>) // geht

                    (<ShipmentActualWeight> )(\d*)\.(\d+)(</ShipmentActualWeight> ) // geht nicht 
                    War ein Abstand drin - sucht er dann einen Ausdruck mit einem Abstand dahinter? Sowas sieht man aber auch immer nicht gleich, bin da so fixiert auf die Zeichen...

                    Danke, jetzt bau ich es ein, mal sehen, was rauskommt...

                    EDIT:

                    Mist, hier im Fenster stimmt es, angezeigt wird es aber gleich:
                    Der Unterschied ist ein abstand in der unteren Zeile zwischen dem ersten > und der )

                    Himmel und die Slashes macht er auch raus!

                    Sowas, nach dem dritten Absenden stimmen die Abstände - aber die Backslashes fehlen noch immer. (Smilies deaktiviert)

                    Zuletzt geändert von Coniaric; 12.02.2008, 17:17.
                    Gruß, Coni
                    ~~ codito ergo sum - ich code, also bin ich! ~~

                    Kommentar


                    • #11
                      Ja, der Haken ist, daß ich nicht weiß, WAS zwischen den TAGs steht.
                      Und was spricht gegen folgendens?
                      PHP-Code:
                      $text str_replace ( array ( ',''.' ), ''$text ); 
                      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                      Kommentar


                      • #12
                        Original geschrieben von tontechniker
                        Und was spricht gegen folgendens?
                        PHP-Code:
                        $text str_replace ( array ( ',''.' ), ''$text ); 
                        Werden dann nicht auch andere Punkte außerhalb meines TAGs ersetzt?
                        z.B. <Version1.0> ?
                        Gruß, Coni
                        ~~ codito ergo sum - ich code, also bin ich! ~~

                        Kommentar


                        • #13
                          sucht er dann einen Ausdruck mit einem Abstand dahinter?
                          Das wird wohl so sein...
                          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                          Kommentar


                          • #14
                            Ähm...H2O...kannst mir nochmal kurz helfen?

                            Es können 1 bis mehrere Leerzeichen vor der Zahl stehen, z.B. so

                            <ShipmentActualWeight> 0.1</ShipmentActualWeight>

                            Kann man da, wo (d*) steht noch irgendwie trimmen?
                            Gruß, Coni
                            ~~ codito ergo sum - ich code, also bin ich! ~~

                            Kommentar


                            • #15
                              Es können 1 bis mehrere Leerzeichen vor der Zahl stehen, z.B. so
                              Also etwas wie
                              \s*(\d*)\.(\d+)
                              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                              Kommentar

                              Lädt...
                              X