Zeichenkette zwischen zwei bestimmten Ausdrücken ersetzen

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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); 
    Last edited by H2O; 12-02-2008, 15:23.
    Gruss
    H2O

    Comment


    • #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)

      Comment


      • #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

        Comment


        • #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! ~~

          Comment


          • #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! ~~

            Comment


            • #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! ~~

              Comment


              • #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! ~~

                Comment


                • #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

                  Last edited by jahlives; 12-02-2008, 16: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)

                  Comment


                  • #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)

                    Last edited by Coniaric; 12-02-2008, 16:17.
                    Gruß, Coni
                    ~~ codito ergo sum - ich code, also bin ich! ~~

                    Comment


                    • #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]

                      Comment


                      • #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! ~~

                        Comment


                        • #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)

                          Comment


                          • #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! ~~

                            Comment


                            • #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)

                              Comment

                              Working...
                              X