2016-04-10 13 views
1

Ich versuche, eine Folge von Zahlen durch Null zu ersetzen. Immer die erste Ziffer behalten und den Rest durch Null ersetzen. Etwas wie folgt aus:Wie wird die Anzahl der übereinstimmenden Zeichen gezählt?

$numb = 4124; 
$newnumb = 4000; // what I want 

Hinweis: Manchmal gibt es eine Float-Zahl wie diese 212.1. Für Float-Nummern passe ich Float-Teil nicht an. Also in 212.1, ich nur passen 212.


Hier ist mein Muster:

^(\d)([^\.]+) 

Jetzt $1 erste Stelle enthält, und ich möchte wissen, wie kann ich 0 statt die restlichen Ziffern stellen?


Beispiele:

423.13 => 400 
1232 => 1000 
99.123 => 90 

Wie kann ich tun, dass Regex?

+0

'$ taub ', gut das ist ein neues .....';) ' – Druzion

Antwort

2

Sie können den \G Anker:

echo preg_replace('/(?:\G(?!\A)|\d)\K\d(?:\.\d*)?/S', '0', $num); 

Details:

(?: 
    \G  # position after the previous match 
    (?!\A) # (but not at the start of the string) 
    |   # OR 
    \d  # first digit (you can also check if there is no leading dot) 
) 
\K   # start the match result at this position 
       # (to preserve the first digit) 
\d 
(?:\.\d*)? # eventual decimals (you can change * to + to avoid to 
      # remove a dot that ends a sentence) 

effiziente (mit \d in Faktor am Anfang):

echo preg_replace('/\d(?:(?<=\G.)|\K\d)(?:\.\d+)?/', '0', $num); 
+0

Ich denke, du bist die beste Person, die '\ G' Anker verwenden kann. Denn das ist die zweite Antwort, die ich von dir bekomme * ([deine erste Antwort] (http://stackoverflow.com/questions/36049576/how-can-i-match-specific-character-between-specific-range-in-in-in- the-string # 36050318)) * .. danke nochmal – stack

3

Wie Sie haben bereits die Präfekten regex ^(\d)([^\.]+) Sie brauchen nur preg_replace_callback() zu verwenden und die Menge von Zeichen in der zweiten Erfassungsgruppe mit str_repeat() zum Drucken verwenden, um die Menge von 0'en Sie wollen, zum Beispiel

echo preg_replace_callback("/^(\d)([^\.]+)\..*/", function($m){ 
    return $m[1] . str_repeat(0, strlen($m[2])); 
}, $string); 
+0

Odd .. float Teil ist immer noch https://3v4l.org/aetdk – stack

+0

@stack Wenn Sie den Float-Teil entfernen möchten , fügen Sie einfach '\ .. *' am Ende der RegEx – Druzion

+0

Ich tat .. aber in diesem Fall ist die Anzahl der "0" nicht korrekt https://3v4l.org/BiTJu – stack

Verwandte Themen