ulli: preg_replace mit & und &

hallo

hat jmd ne möglichst elegante idee, wie ich/man alle & aus einem string (die nicht aus dem teilstring & sind) in solche (&) umwandeln kann?
ich dachte da an preg_replace.

$string = "m.php?nm=STL&fi=f_l&all=1&su=1";
$tmp = preg_replace("/(&[^amp;])/","&",$string);

produziert mir:
m.php?nm=STL&i=f_l&all=1&u=1

was ist an /(&[^amp;])/ falsch?

cu
ulli

  1. Hi Ulli,

    preg_replace ist sicherlich die richtige Methode.

    preg_replace("/(&[^amp;])/","&",$string);

    bedeutet:
    ersetze alle & mit & - allerdings nur jene & die nicht von amp gefolgt werden.

    hat jmd ne möglichst elegante idee, wie ich/man alle & aus einem string (die nicht aus dem teilstring & sind) in solche (&) umwandeln kann?

    Die Frage ist etwas verwirrend. Welches Zeichen möchtest Du denn mit welchen ersetzen?

    Eva

    1. hallo

      preg_replace("/(&[^amp;])/","&",$string);
      bedeutet:
      ersetze alle & mit & - allerdings nur jene & die nicht von amp gefolgt werden.

      ja eben nicht =( ...
      in dem von mir angegebene beispiel wird
      m.php?nm=STL&fi=f_l&all=1&su=1
      zu:
      m.php?nm=STL&i=f_l&all=1&u=1
      übersetzt

      Die Frage ist etwas verwirrend. Welches Zeichen möchtest Du denn mit welchen ersetzen?

      alle & in & aber nur, wenn nicht schon ein & da steht

      cu
      ulli

    2. Sorry, kleine Korrektur:

      preg_replace ist sicherlich die richtige Methode.

      preg_replace("/(&[^amp;])/","&",$string);

      bedeutet:

      Ersetze alle & plus das folgende Zeichen (genau eines) mit & - allerdings nur jene & plus folgendes Zeichen, die nicht &a &m &p oder &; sind.

      Denn die Klammern [] umschließen immer eine Zeichenmenge in regulären Ausdrücken.

      1. hallo

        Sorry, kleine Korrektur:
        Ersetze alle & plus das folgende Zeichen (genau eines) mit & - allerdings nur jene & plus folgendes Zeichen, die nicht &a &m &p oder &; sind.

        ok ... und wie sag ich ihm dann : ersetze alle & die nicht von amp; gefolgt werden? =)

        cu
        ulli

        1. ok ... und wie sag ich ihm dann : ersetze alle & die nicht von amp; gefolgt werden? =)

          versuch es mal mit

          /&^(amp;)/

          runde Klammern gruppieren Zeichen.

          Das O'Reilley Buch "Programmieren mit Perl" hat übrigens eine schöne Übersicht für reguläre Ausdrücke. Vielleicht findest Du ja jemanden, der das Buch hat (und wenns nur die Bibliothek ist).

          Leider hab ich das Buch grad nicht da, sonst wäre ich mir mit der Antwort auf Deine Frage sicherer.

          Im Selfhtml gibt es auch ein Kapitel über reguläre Ausdrücke. Vielleicht kann Dir das weiter helfen, wenn mein obiger Tip doch nicht richtig ist.

          Eva

          1. Hi,

            versuch es mal mit

            ein gutes Beispiel dafür, dass blindes Herumprobieren extrem nutzfrei ist.

            runde Klammern gruppieren Zeichen.

            Das "^" steht außerhalb von Zeichenklassen trotzdem für den String- bzw. Zeilenanfang.

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
  2. ich habs ...
    assertions sind die lösung

    http://de.php.net/manual/de/pcre.pattern.syntax.php
    (hab vergessen, wie man hier links macht)

    würde in meinem fall
    $tmp = preg_replace("/&(?!amp;)/","&",$string);
    ergeben

    ulli