Entfernen Sie nicht numerische Zeichen (außer Punkte und Kommas) aus einer Zeichenfolge

150

Wenn ich folgende Werte habe:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Wie kann ich eine neue Variable erstellen und sie auf eine Kopie der Daten setzen, bei der nicht numerische Zeichen mit Ausnahme von Kommas und Punkten entfernt wurden? Die obigen Werte würden die folgenden Ergebnisse zurückgeben:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11
user485783
quelle

Antworten:

335

Mit preg_replace können Sie alle nicht numerischen Zeichen sowie Komma und Punkt / Punkt wie folgt austauschen:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>
John Parker
quelle
6
siehe auch PHP-Funktion money_function () ( php.net/manual/en/function.money-format.php )
Horatio
5
[^ 0-9] stimmt mit jedem nicht numerischen Zeichen überein, daher müssen Komma und Punkt nicht hinzugefügt werden. Dies ist ausreichend: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
Billrichards
6
@ Billrichards Ich denke nicht, dass das richtig ist. Denken Sie daran, dass er das Komma und den Punkt zusammen mit den numerischen Zeichen beibehalten und nicht entfernen möchte.
Richt222
1
@billrichards Wie im OP angegeben (Hervorhebung von mir), "vermeiden Sie Alphabete oder Zeichen außer Komma und Punkt ".
John Parker
Braucht diese Zeit keinen Backslash? Punkt bedeutet "irgendein Charakter", nicht wahr?
Scott
66

Ich bin überrascht, dass filter_var hier nicht erwähnt wurde, da dies eine so alte Frage ist ...

PHP verfügt über eine integrierte Methode zur Verwendung von Desinfektionsfiltern . Insbesondere wird in dieser Situation FILTER_SANITIZE_NUMBER_FLOATdie FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDFlags verwendet. Wie so:

$numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT,
    FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
echo $numeric_filtered; // Will print "3,373.31"

Es könnte auch erwähnenswert sein, dass es, da es in PHP integriert ist, etwas schneller ist als die Verwendung von Regex mit den aktuellen PHP-Bibliotheken (wenn auch buchstäblich in Nanosekunden).

Bryan Way
quelle
2
IMO das ist die beste Antwort.
Ogier Schelvis
30

Der einfachste Weg, um wirklich alle nicht numerischen Zeichen zu entfernen:

echo preg_replace('/\D/', '', $string);

\D steht für "jedes Zeichen, das keine Dezimalstelle ist"

http://php.net/manual/en/regexp.reference.escape.php

mopo922
quelle
Dies ist bei weitem die schönste Antwort :)
baron_bartek
4

Sie können filter_varalle unzulässigen Zeichen außer Ziffern, Punkten und Kommas entfernen.

  • Der FILTER_SANITIZE_NUMBER_FLOATFilter wird verwendet, um alle nicht numerischen Zeichen aus der Zeichenfolge zu entfernen.
  • FILTER_FLAG_ALLOW_FRACTION erlaubt Fraktionstrenner " . "
  • Der Zweck FILTER_FLAG_ALLOW_THOUSAND, Komma aus der Zeichenfolge zu erhalten.

Code

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

Ausgabe

12.322,11

Weitere Informationen zu filter_var () und Sanitize-Filtern

Adeel
quelle
2

Wenn die Anforderung darin besteht, alle (und nicht nur ein) nicht numerischen Zeichen zu entfernen, kann das vorherige möglicherweise auf sehr einfache Weise so geschrieben werden (Sie können jedoch eine Funktion schreiben, um die Zeichenfolge zu übergeben und den erforderlichen Wert ohne Zeichen zurückzugeben .. wie auch immer..):

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>
andymnc
quelle
1

Wenn Buchstaben immer am Anfang oder am Ende stehen, können Sie einfach nur Trimmen verwenden ... kein regulärer Ausdruck erforderlich

$string = trim($string, "a..zA..Z"); // this also take care of lowercase

"AR3,373.31" --> "3,373.31"
"12.322,11T" --> "12.322,11"
"12.322,11"  --> "12.322,11"
Andrew
quelle
Wichtig: Dadurch werden nur Buchstaben aus der Zeichenfolge entfernt. Andere Zeichen wie Leerzeichen, Klammern, Anführungszeichen usw. bleiben im Ergebnis erhalten. -> Verwenden Sie diese Lösung nur, wenn Sie wissen, dass Ihre Eingabezeichenfolge nur Buchstaben und Zahlen und keine anderen Zeichen enthält!
Philipp
-1

Gleiche Antwort wie Middaparka, aber entfernen Sie die,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);
jonasdev
quelle
Bitte fügen Sie die Links zu Ihrem Blog / Ihrer Website in den Posts nicht hinzu. Das könnte als Spam angesehen werden.
Tushar
Downvote: Weil Middaparkas Antwort perfekt war. Das OP möchte Punkte und Kommas behalten, aber Ihre Antwort entfernt sie.
Carlos2W