Hapus karakter non-numerik (kecuali titik dan koma) dari string

150

Jika saya memiliki nilai berikut:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Bagaimana saya bisa membuat variabel baru dan mengaturnya ke salinan data yang karakter non-numeriknya dihapus, dengan pengecualian koma dan titik? Nilai-nilai di atas akan mengembalikan hasil berikut:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11
pengguna485783
sumber

Jawaban:

335

Anda dapat menggunakan preg_replace untuk menukar semua karakter non numerik dan koma dan titik / penghentian penuh sebagai berikut:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>
John Parker
sumber
6
lihat juga fungsi php money_function () ( php.net/manual/en/function.money-format.php )
horatio
5
[^ 0-9] akan cocok dengan karakter non-numerik apa pun, jadi tidak perlu menambahkan koma dan berhenti penuh. Ini cukup: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards
6
@ Billillards Saya tidak berpikir itu benar. Ingat dia ingin mempertahankan koma dan berhenti penuh, bersama dengan karakter numerik, bukan menghapusnya.
Richt222
1
@ billrichards Seperti yang dinyatakan OP (penekanan milikku), "hindari huruf atau karakter kecuali koma dan titik ".
John Parker
bukankah periode itu membutuhkan backslash? titik berarti "karakter apa saja" bukan?
Scott
66

Saya terkejut tidak ada lagi filter_var di sini karena ini adalah pertanyaan lama ...

PHP memiliki metode bawaan untuk melakukan ini menggunakan filter sanitasi . Secara khusus, yang digunakan dalam situasi ini adalah FILTER_SANITIZE_NUMBER_FLOATdengan FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDbendera. Seperti itu:

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

Mungkin juga bermanfaat untuk dicatat bahwa karena built-in ke PHP, itu sedikit lebih cepat daripada menggunakan regex dengan pustaka PHP saat ini (meskipun secara harfiah dalam nanodetik).

Bryan Way
sumber
2
IMO ini adalah jawaban terbaik.
Ogier Schelvis
30

Cara termudah untuk benar-benar menghapus semua karakter non-numerik:

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

\D mewakili "karakter apa pun yang bukan digit desimal"

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

mopo922
sumber
Ini adalah jawaban yang paling baik :)
baron_bartek
4

Anda dapat menggunakan filter_varuntuk menghapus semua karakter ilegal kecuali angka, titik dan koma.

  • The FILTER_SANITIZE_NUMBER_FLOATfilter digunakan untuk menghapus semua karakter non-numerik dari string.
  • FILTER_FLAG_ALLOW_FRACTION memungkinkan pemisah fraksi " . "
  • Tujuan FILTER_FLAG_ALLOW_THOUSANDuntuk mendapatkan koma dari string.

Kode

$var1 = '12.322,11T';

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

Keluaran

12.322,11

Untuk membaca lebih lanjut tentang filter_var () dan Sanitasi filter

Adeel
sumber
2

Jika permintaan adalah untuk menghapus semua (dan tidak hanya satu) karakter non numerik, mungkin yang sebelumnya dapat ditulis seperti ini dengan cara yang sangat sederhana (tetapi Anda dapat menulis fungsi untuk meneruskan string dan membuatnya mengembalikan nilai yang dibutuhkan tanpa karakter .. pokoknya ..):

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

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

Jika huruf selalu di awal atau di akhir, Anda cukup menggunakan trim ... tidak diperlukan regex

$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
sumber
Penting: Ini hanya akan menghapus huruf dari string. Karakter lain, seperti spasi, tanda kurung, tanda kutip, dll disimpan dalam hasilnya. -> Hanya gunakan solusi ini, jika Anda tahu bahwa string input Anda hanya berisi huruf dan angka, dan tidak ada karakter lain!
Philipp
-1

Jawaban yang sama dengan middaparka tetapi hapus,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);
jonasdev
sumber
Tolong jangan menambahkan tautan ke blog / situs Anda di posting. Itu bisa dianggap sebagai spam.
Tushar
Downvote: Karena jawaban middaparka sempurna. OP ingin menyimpan titik dan koma tetapi jawaban Anda menghapusnya.
Carlos2W