Frage

Ich habe Strings in Form \d+_\d+ und ich möchte 1 in die zweite Zahl hinzuzufügen. Da meine Erklärung so ganz klar ist, lassen Sie mich Ihnen ein paar Beispiele:

  • 1234567_2 sollte sich 1234567_3
  • 1234_10 sollte sich 1234_11

Hier ist mein erster Versuch:

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)$2)+1, $old);

Dies führt zu einem Syntaxfehler:

  

Parse-Fehler: Syntaxfehler, unerwartete   T_LNUMBER, erwartet T_VARIABLE oder '$'   in [...] on line 201

Hier ist mein zweiter Versuch

$new = preg_replace("/(\d+)_(\d+)/", "$1_".("$2"+1), $old);

Diese Transformationen alt $ = 1234567_2 in $ new = 1234567_1, was nicht der gewünschte Effekt ist

Mein dritte Versuch

$new = preg_replace("/(\d+)_(\d+)/", "$1_".((int)"$2"+1), $old);

Dieses yeilds das gleiche Ergebnis.

Durch diese Versuche zu machen, erkennen ich, ich verstand nicht, wie das neue $ 1, $ 2, $ 3, .. Variablen wirklich funktioniert, und so habe ich nicht wirklich wissen, was anderes zu versuchen, weil es scheint, dass diese Variablen nicht mehr existiert beim Verlassen der preg_replace Funktion ...

Irgendwelche Ideen?

War es hilfreich?

Lösung

$new = preg_replace("/(\d+)_(\d+)/e", '"$1_" . ("$2" + 1)', $old);

Die $1 usw. Begriffe sind nicht wirklich Variablen, sie sind Zeichenfolgen, die preg_replace im Ersetzungstext interpretiert. So gibt es keine Möglichkeit, diese mit gerade textbasierten preg_replace zu tun.

Allerdings ist der /e Modifikator auf dem regulären Ausdruck fragt preg_replace die Substitution zu interpretieren als Code , wobei das Token $1 usw. tatsächlich als Variablen behandelt werden. Sie geben den Code als String und preg_replace wird es in dem richtigen Kontext eval(), dessen Ergebnis als Ersatz verwendet wird.

Andere Tipps

Hier ist die Lösung für die PHP 5.3 (jetzt, wenn PHP unterstützt lambdas)

$new = preg_replace_callback("/(\d+_)(\d+)", function($matches)
{
    return $matches[1] . (1 + $matches[2]);
}
, $new);

Mit explode (Schritt-für-Schritt):

$string = "123456_2";

echo $string;

$parts = explode("_", $string);

$lastpart = (int)$parts[1];

$lastpart++;

$newstring = $parts[0] . "_" . (string)$lastpart;

echo $newstring;

Dies trennt die Zeichenfolge auf dem Zeichen „_“ und wandelt den zweiten Teil auf eine ganze Zahl. Nachdem die ganze Zahl erhöht wird, wird die Zeichenfolge neu erstellt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top