[REGEX] replace mit unterausdrücken

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

  • [REGEX] replace mit unterausdrücken

    ich hab grad das totale brett vor dem kopf ...

    folgendes:
    PHP-Code:
    $subject 'der hund schläft in der maschine';
    $pattern '/hund(.*)maschine/'
    will ich jetzt den kompletten match markieren, benutz ich ungefähr dieses:
    PHP-Code:
    preg_replace ($pattern'{b}\\0{/b}'$subject1); 
    was dann das ergibt:
    Code:
    der {b}hund schläft in der maschine{/b}
    jetzt möchte ich die unter-ausdrücke markieren, so daß dann folgendes entsteht:
    Code:
    der {b}hund{m1} schläft in der {/m1}maschine{/b}
    fällt euch da spontan eine gute lösung ein? wie gesagt, ich hab zwar einen ansatz, der scheint mir aber viel zu kompliziert (callback + bastelei^^), außerdem ... scheint mir die lösung wirklich simple zu sein, sie fällt mir nur nicht ein ... *g. wie gesagt, brett vorm kopp. und je länger ich drüber nachdenke, desto schlimmer wirds.
    danke
    OffTopic:
    könnte auch bs sein
    Die Zeit hat ihre Kinder längst gefressen

  • #2
    hilft dir das weiter?
    PHP-Code:
    $subject 'der hund schläft in der maschine';
    $pattern '/(hund)(.*)(maschine)/';
    preg_replace ($pattern'{b}\\1{m1}\\2{/m1}\\3{/b}'$subject1); 
    Kissolino.com

    Kommentar


    • #3
      nee,

      nicht wirklich. das war auch meine idee. oder ich denke falsch.

      das problem ist, daß alles dynamisch ist (soll mal regexp evaluator werden, der dann die matches nicht nur anzeigt, sondern halt auch markiert) ... und ich somit den regex erst umstricken müßte ... bevor ich so ersetzen kann ... und das dann für jeden unterausdruck ... ehrlich gesagt, fällt mir auch nix ein, um den regexp (eindeutig) umzubasteln ... weißt?
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        Hi, ganz ganz leicht...

        ein lösungsbeispiel:
        PHP-Code:
        $subject 'der hund schläft in der maschine';
        $prefix    substr$subject0strpos$subject' ' ) );
        $suffix    substr$subjectstrrpos$subject' ' )+);
        $pattern "/({$prefix})(.*)({$suffix})/";

        var_dumppreg_replace$pattern'{b}\1{m1}\2{/m1}\3{/b}'$subject) ); 
        bin mir nicht sicher was sich das bringen soll, aber auf den regex kannst du sicher ganz verzichten?! bei den meisten dingen denen man so begegnet reichen die schnelleren string funktionen meist aus.

        ciao
        Zuletzt geändert von freudenspender; 16.07.2004, 16:03.

        Kommentar


        • #5
          wär ja auch zu einfach gewesen

          wie muss ich mir das vorstellen? da kommen x begriffe + wildcards per
          formular und sollen gematched werden? wenns geht, gib mal nen ausführlicheres beispiel.
          Kissolino.com

          Kommentar


          • #6
            Hi, ganz ganz leicht...
            wenn du meinst
            dann hilf mir bitte nochmal

            target:
            -
            der hund schläft in der maschine
            in der maschine schläft der hund
            -
            regexp: /hund(.*)in(.*)der((.*)ma(.*))hund/isU


            ergebnis sollte so sein (weiß nicht, obs so paßt ^^), aber zum vorstellen ...:
            -
            der hund{m1} schläft {/m1}in{m2} {/m2}der{m3}{m4} {/m4}ma{m5}schine
            in der maschine schläft der {/m5}{/m3}hund
            -
            ...
            wie muss ich mir das vorstellen? da kommen x begriffe + wildcards per
            formular und sollen gematched werden? wenns geht, gib mal nen ausführlicheres beispiel.
            so ähnlich wie hier ... http://pcre.nophia.de/pcre/index.php (nicht mit ie(5?) anschauen, der spackt rum ...)
            die matchenden subpattern solln halt farblich hinterlegt werden ... bzw. von tags umschlossen werden, damit man ... per radio-box den entsprechenden match auswählen kann ...
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              ich weiss nicht, obs weiter hilft, aber als ansatz:

              - den pattern (rekursiv) in ein (mehrdim-)array verwandeln
              - das array rekursiv durchlaufen und die formatmarken einfügen
              - ...

              dafür verschieb ich jetzt erstmal zu bs ... mal sehen was den regex-experten dazu einfällt ... bin gespannt
              Kissolino.com

              Kommentar


              • #8
                versuch mal sowas in der art
                PHP-Code:
                $target 'der hund schläft in der maschine';
                $pattern '/hund(.*)in(.*)maschine/';
                preg_match_all($pattern$target$matches);
                for (
                $i 1$i count($matches); $i++)
                    
                $matches[0][0] = preg_replace('`(?<!\\{m\\d\\})'.$matches[$i][0].'`'
                    
                '{m'.$i.'}'.$matches[$i][0].'{/m'.$i.'}'
                    
                $matches[0][0], 
                    
                1);
                echo 
                '{b}'.$matches[0][0].'{/b}'
                durch das nagetive lookbehind gedöns (?<!\m\d\}) werden nur die ausdrücke ersetzt, die kein {mzahl} vornedran stehen haben (zumindest hab ich mir das so geacht )
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  versuch mal sowas in der art
                  sieht gut aus, aber:

                  target: der hund schläft in der maschine
                  regexp: hund(.*)mas(ch)ine
                  macht: {b}hund{m1} s{m2}ch{/m2}läft in der {/m1}maschine{/b}

                  naja, ... aber ich hab noch was in petto. hab letztlich was von offset gelesen, es dann aber in meinem (pre 4.3) buch nicht wieder gefunden

                  int preg_match_all ( string pattern, string subject, array matches [, int flags [, int offset]])

                  lala.
                  Die Zeit hat ihre Kinder längst gefressen

                  Kommentar

                  Lädt...
                  X