steffi: spezielles Ersetzen...

hi
wie kann ich (mittels preg_replace) in einem string textstellen ersetzen, sofern sie von 2 trennzeichen umschlossen sind, die auch im such string enthalten sind?
also folgendes beispiel:
$txt="abc<bla <mist> bla oder auch kein bla mehr nach dem <mist>enthalten ist>, aber nicht, wenn <mist> außerhalb von <> vorkommt";
$zu_ersetzen="<mist>";
^ das problem ist im $text beschrieben...
wie geht das?
habe nun einige stunden wiedereinmal mit dem lesen von manuals für regex verbracht. vergeblich... brauche daher eure hilfe.
danke, bussi

  1. Hi,

    habe nun einige stunden wiedereinmal mit dem lesen von manuals für regex verbracht. vergeblich...

    kein Wunder, das Problem ist bekanntermaßen mit RegExp allein nicht lösbar. Du hast kein Muster vorliegen, sondern eine Struktur. Analysiere bzw. parse diese also.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. hi
      mehr als das ganze in worte zu fassen schaff ich irgendwie nicht.
      ist '<mist>' umschlossen von <.*? und .*?>, so ist es zu ersetzen durch 'ersatz'.
      muss doch irgendwie möglich sein... dass als regexp zu formulieren.
      ich mach einfach mal nen vorschlag und hoffe, dass ihr mich korrigiert:
      /<.*?(<mist>).*?>/
      es soll aber das "drumherum" .*? nicht ersetzt werden. nur der mist...
      danke

      1. Liebe(r) steffi,

        ich mach einfach mal nen vorschlag und hoffe, dass ihr mich korrigiert:
        /<.*?(<mist>).*?>/

        Das Fragezeichen bedeutet "Zeichen davor kommt 0x oder 1x vor". Wenn Du ein Fragezeichen suchst, dann musst Du es "escapen", und das sieht so aus: ?
        Das sieht mir nach eingeschobenen Server-Script-Anweisungen aus. In einem PHP-Script könnte sowas stehen:

        <html>  
        ....  
        <body><?php  
          
        [code lang=php]echo "irgendwas";
        

        ?></body>[/code]

        Willst Du nun aus dieser Datei den serverseitigen Scriptanteil ersetzen? Da hast Du doch ein regelrechtes "Tag" dafür! Du hast "<?xyz" zum Öffnen und "?>" zum Schließen! Dann suche doch exakt danach!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Hallo Felix,

          /<.*?(<mist>).*?>/
          Das Fragezeichen bedeutet "Zeichen davor kommt 0x oder 1x vor".

          Nein, hier schaltet das Fragezeichen den * auf "ungierig".

          Grüße aus Nürnberg
          Tobias

          1. Nein, hier schaltet das Fragezeichen den * auf "ungierig".

            ja, eben dieses wollte ich bezwecken.
            doch nun wird alles ab dem ersten < ersetzt hin zu dem ersten > nach dem vorgekommenen <mist>.
            das .*? soll nicht verschwinden...
            danke für tipps

            1. Lieber steffi,

              Nein, hier schaltet das Fragezeichen den * auf "ungierig".
              ja, eben dieses wollte ich bezwecken.
              doch nun wird alles ab dem ersten < ersetzt hin zu dem ersten > nach dem vorgekommenen <mist>.
              das .*? soll nicht verschwinden...

              AHA! Dann musst Du Klammern nehmen und mit Backreferences arbeiten.

              $text = preg_replace("/<(.*?)(<mist>)(.*?)>/", "\\1$zu_ersetzen\\3", $text);

              Liebe Grüße aus Ellwangen,

              Felix Riesterer.

      2. Hi,

        muss doch irgendwie möglich sein... dass als regexp zu formulieren.

        nein, muss und ist es nicht. Für solche Aufgaben sind Regular Expressions weder gedacht noch geeignet.

        ich mach einfach mal nen vorschlag und hoffe, dass ihr mich korrigiert:

        Die Korrektur lautet: Gehe von der Fehlvorstellung ab, das ganze nur mit RegExp lösen zu können.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Liebe(r) steffi,

    wahrscheinlich ist da ein SGML-Parser (oder sowas) sinnvoller, als das mit regulären Ausdrücken zu lösen... mal sehen.

    $txt="abc<bla <mist> bla oder auch kein bla mehr nach dem <mist>enthalten ist>, aber nicht, wenn <mist> außerhalb von <> vorkommt";
    $zu_ersetzen="<mist>";

    • Also ich suche nach einem ersten "<".

    • Ok. Wenn ich das gefunden habe, dann darf da kein "mist" stehen, denn sonst stünde da ein sozusagen freies "<mist>" auf weiter Flur, ohne umspannendes <>.

    • Ok. Es folgt also kein "mist", sondern ein anderes Zeichen.

    • Ok. Jetzt will ich jedes "<mist>" matchen, das ich finden kann, bevor ich ein herrenloses ">" finde.

    • Ok. Am Ende steht ganz sicher ein ">", also endet da mein Ausdruck.

    • Prima! Jetzt das Ganze als RegExp schreiben! *Uff!

    danke, bussi

    ... muss ich? ... *fg*

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.