Wie kann ich, erhöht und ersetzen in PHP finden?
-
25-09-2019 - |
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?
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.