Usuń znaki nieliczbowe (z wyjątkiem kropek i przecinków) z ciągu

150

Jeśli mam następujące wartości:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Jak mogę utworzyć nową zmienną i ustawić ją jako kopię danych, z której usunięto wszystkie znaki nieliczbowe, z wyjątkiem przecinków i kropek? Powyższe wartości zwróciłyby następujące wyniki:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11
user485783
źródło

Odpowiedzi:

335

Możesz użyć preg_replace, aby zamienić wszystkie znaki nienumeryczne oraz przecinek i kropkę / kropkę w następujący sposób:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>
John Parker
źródło
6
patrz także funkcja money_function PHP () ( php.net/manual/en/function.money-format.php )
horatio
5
[^ 0-9] dopasuje dowolny znak nienumeryczny, więc nie jest konieczne dodawanie przecinka i kropki. To wystarczy: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
bilardardy
6
@billrichards Myślę, że to nie jest poprawne. Pamiętaj, że chce zachować przecinek i kropkę wraz ze znakami numerycznymi, a nie ich usuwać.
Richt222
1
@billrichards Jak podał w OP (podkreślenie moje), „unikaj alfabetów lub znaków z wyjątkiem przecinków i kropek ”.
John Parker
czy ten okres nie wymaga odwrotnego ukośnika? kropka oznacza „dowolny znak”, prawda?
Scott
66

Jestem zaskoczony, że nie wspomniano tutaj o zmiennej filter_var , ponieważ jest to tak stare pytanie ...

PHP ma wbudowaną metodę wykonywania tego za pomocą filtrów oczyszczających . W szczególności, jeden do wykorzystania w tej sytuacji jest FILTER_SANITIZE_NUMBER_FLOATz FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDflagami. Tak jak to:

$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"

Warto również zauważyć, że ponieważ jest wbudowany w PHP, jest nieco szybszy niż używanie wyrażenia regularnego z bieżącymi bibliotekami PHP (choć dosłownie w nanosekundach).

Bryan Way
źródło
2
IMO to najlepsza odpowiedź.
Ogier Schelvis
30

Najprostszy sposób, aby naprawdę usunąć wszystkie znaki nienumeryczne:

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

\D reprezentuje „dowolny znak, który nie jest cyfrą dziesiętną”

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

mopo922
źródło
To zdecydowanie najmilsza odpowiedź :)
baron_bartek
4

Możesz użyć filter_vardo usunięcia wszystkich niedozwolonych znaków z wyjątkiem cyfr, kropki i przecinka.

  • Plik FILTER_SANITIZE_NUMBER_FLOATFiltr służy do usuwania wszystkich charakter nienumeryczną z łańcucha.
  • FILTER_FLAG_ALLOW_FRACTION pozwala na separator frakcji " . "
  • Celem FILTER_FLAG_ALLOW_THOUSANDpobrania przecinka z ciągu.

Kod

$var1 = '12.322,11T';

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

Wynik

12.322,11

Aby dowiedzieć się więcej o filtrach filter_var () i Sanitize

Adeel
źródło
2

Jeśli żądaniem jest usunięcie wszystkich (i nie tylko jednego) nieliczbowego znaku, być może poprzedni można zapisać w ten sposób w bardzo prosty sposób (ale możesz napisać funkcję, która przekaże łańcuch i sprawi, że zwróci potrzebną wartość bez znaków .. tak czy siak..):

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

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>
andymnc
źródło
1

Jeśli litery są zawsze na początku lub na końcu, możesz po prostu użyć przycinania ... bez wyrażenia regularnego

$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"
Andrzej
źródło
Ważne: spowoduje to usunięcie tylko liter z ciągu. Inne znaki, takie jak spacje, nawiasy, cudzysłowy itp. Są zachowywane wewnątrz wyniku. -> Używaj tego rozwiązania tylko wtedy, gdy wiesz, że Twój ciąg wejściowy zawiera tylko litery i cyfry, a nie inne znaki!
Philipp,
-1

Ta sama odpowiedź co w przypadku middaparka, ale usuń rozszerzenie,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);
jonasdev
źródło
Nie dodawaj linków do swojego bloga / witryny w postach. Można to uznać za spam.
Tushar
Głos przeciw: ponieważ odpowiedź middaparki była doskonała. OP chce zachować kropki i przecinki, ale Twoja odpowiedź je usuwa.
Carlos2W