regexp (preg_replace) läuft nicht wie erwartet (Neuling!)

Alles, was PHP betrifft, kann hier besprochen werden.

regexp (preg_replace) läuft nicht wie erwartet (Neuling!)

Postby Amarok » 11. January 2008 10:18

Hallo allerseits.

ich habe eine -so dachte ich- "simple" Regex um die Eingabe eine Kreditkartennummer zu "bereinigen" (Leerzeichen, Bindestriche, usw.) erstellt.

Mit RegExp-Coach von Dr. E. Weitz und mit VisualRegExp 3.1 klappt das auch wunderbar. PHP lässt sich aber nicht davon beeindrucken :lol:

Ich bin Neuling in der Materie, ergo stehe ich etwas dumm da momentan.

Der code:
Code: Select all
//Space, Bindestriche und andere Zeichen aus der CC-Nr. entfernen

$cc_pattern="/^([0-9]{4,4})([^0-9])*([0-9]{4,4})([^0-9]|\s)*([0-9]{4,4})([^0-9]|\s)*([0-9]{1,4})$/";
$cc_string=$_POST['pmkreditkarte_cardnumber'];
$cc_replace="$1$3$5$7";
preg_replace($cc_pattern, $cc_replace, $cc_string);


Bei Eingabe von 1234-5678-9012-3456 (Bindestrich durch beliebige nicht-numerischen Zeichen ersetzbar), erwarte ich 1234567890123456 als ergebnis, was o.g. Programme auch liefern.

Was mache ich falsch?

Ach! Testumgebung XAMPP für Windows (letzter Release).

Danke.
Amarok
 
Posts: 4
Joined: 11. January 2008 09:55

Postby Scory » 11. January 2008 12:51

Was mache ich falsch?


Du benutzt Doublequotes bei den Zuweisungen der Strings für $cc_pattern und $cc_replace. Das ist ein schwerer Fehler.

Du mußt stattdessen unbedingt Singlequotes benutzen. Also so:

Code: Select all
$cc_pattern='/^([0-9]{4,4})([^0-9])*([0-9]{4,4})([^0-9]|\s)*([0-9]{4,4})([^0-9]|\s)*([0-9]{1,4})$/';
$cc_string=$_POST['pmkreditkarte_cardnumber'];
$cc_replace='$1$3$5$7';
preg_replace($cc_pattern, $cc_replace, $cc_string);
Scory
 

Postby Amarok » 11. January 2008 13:40

Danke Scory.... aber mit single-quotes passiert genau dasselbe: nämlich nix :cry:

Sonst noch etwas falsches daran?
Amarok
 
Posts: 4
Joined: 11. January 2008 09:55

Postby Scory » 11. January 2008 14:12

Ich benutze die Dollarsyntax für Ersetzungspattern in PHP eigentlich nicht, sondern die Syntax mit dem Backslash. Vielleicht liegt es daran:

Code: Select all
...
$cc_replace='\1\3\5\7';
...


Unabhängig davon sehe ich allerdings noch einen schweren Fehler - Du fängst das Resultat von preg_replace() überhaupt nicht auf! SO macht dein Script gar nichts. Wo willst Du denn das Ergebnis ablegen?
Scory
 

Postby Amarok » 11. January 2008 14:18

Ich werd's probieren und berichten.

Das Teil wo der Wert weiterverarbeitet wird habe ich nicht eingeschlossen, ich wollte das Forum nicht zumüllen. Ich sehe aber schon im Debugger, daß nix dabei rauskommt direkt nach dem preg_replace.
Amarok
 
Posts: 4
Joined: 11. January 2008 09:55

Postby Scory » 11. January 2008 16:48

Amarok wrote:Ich sehe aber schon im Debugger, daß nix dabei rauskommt direkt nach dem preg_replace.


Was heißt "nichts raus kommt" - Du fängst es nicht ab! Du mußt den Rückkehrwert von preg_replace() einer Variablen zuweisen - denn da (und nur da!) steht das Ergebnis der Ersetzung drin:

Code: Select all
...
$ergebnis = preg_replace($cc_pattern, $cc_replace, $cc_string); // nur so geht es!

echo $ergebnis; // so kannst Du beispielsweise das Ergebnis ausgeben lassen

...
Scory
 

Postby Amarok » 15. January 2008 14:43

:oops: Ups, da war noch was...

Wieder mal ein Wald-Bäume-Erlebnis :lol: Ich sollte mich langsam daran gewöhnen den Code richtig und aufmerksam durchzugehen.
Mensch, ist das peinlich. Sorry für die dumme Frage und danke für Deine Antworten (vom Geduld ganz zu schweigen).
Amarok
 
Posts: 4
Joined: 11. January 2008 09:55

Postby Mätes » 16. January 2008 10:38

kann jedem passieren.

aber tuts nicht auch
echo preg_replace('/\D/', '', $cc_string);

\D steht für alle Zeichen, die keine Zahlen sind.

?
ma
User avatar
Mätes
 
Posts: 142
Joined: 13. April 2006 09:34
Location: kölle


Return to PHP

Who is online

Users browsing this forum: No registered users and 61 guests