Dizeden sayısal olmayan karakterleri (nokta ve virgül hariç) kaldırma


150

Aşağıdaki değerlere sahipsem:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Nasıl yeni bir değişken oluşturabilir ve virgül ve nokta hariç, sayısal olmayan karakterlerin kaldırıldığı verilerin bir kopyasına nasıl ayarlayabilirim? Yukarıdaki değerler aşağıdaki sonuçları döndürür:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Yanıtlar:


335

Nümerik olmayan tüm karakterleri ve virgül ile nokta / nokta noktasını aşağıdaki gibi değiştirmek için preg_replace komutunu kullanabilirsiniz :

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>

6
ayrıca bkz php fonksiyonu money_function () ( php.net/manual/en/function.money-format.php )
horatio

5
[^ 0-9] sayısal olmayan herhangi bir karakterle eşleşeceğinden, virgül ve nokta eklemek gerekmez. Bu yeterlidir: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
14:02

6
@billrichards Bunun doğru olduğunu düşünmüyorum. Sayısal karakterlerle birlikte virgül ve tam durağı korumak istediğini unutmayın.
Richt222

1
@billrichards OP'nin belirttiği gibi (benimkini vurgulayın), "alfabe veya karakterlerden virgül ve nokta hariç kaçının ".
John Parker

o dönemin ters eğik çizgiye ihtiyacı yok mu? nokta "herhangi bir karakter" demek değil mi?
Scott

66

Bu kadar eski bir soru olduğu için burada filter_var'dan bahsedilmediğine şaşırdım ...

PHP, sanitizasyon filtreleri kullanarak bunu yapmak için yerleşik bir yönteme sahiptir . Özellikle, bu durumda kullanılacak FILTER_SANITIZE_NUMBER_FLOATolan FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDbayraklarla. Şöyle ki:

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

PHP'de yerleşik olduğu için PHP'nin şu anki kitaplıklarıyla (kelimenin tam anlamıyla nanosaniye de olsa) normal ifadeyi kullanmaktan biraz daha hızlı olduğunu belirtmek faydalı olabilir .


2
IMO bu en iyi cevap.
Ogier Schelvis


4

filter_varRakamlar, nokta ve virgül hariç tüm yasadışı karakterleri kaldırmak için kullanabilirsiniz .

  • FILTER_SANITIZE_NUMBER_FLOATFiltre dizesi olmayan tüm sayısal karakter kaldırmak için kullanılır.
  • FILTER_FLAG_ALLOW_FRACTION kesir ayırıcısına izin veriyor " . "
  • FILTER_FLAG_ALLOW_THOUSANDDizeden virgül almanın amacı .

kod

$var1 = '12.322,11T';

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

Çıktı

12.322,11

Filter_var () ve Sanitize filtreleri hakkında daha fazla bilgi için


2

İstek sayısal olmayan karakterlerin tümünü (yalnızca birini değil) kaldırmaksa, belki de önceki gibi çok basit bir şekilde bu şekilde yazılabilir (ancak dizeyi geçmek ve karakterleri karakter olmadan döndürmek için bir işlev yazabilirsiniz .. neyse ..):

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

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

1

Harfler her zaman başlangıçta veya sonundaysa, sadece trim'i kullanabilirsiniz ... normal ifade gerekmez

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

Önemli: Bu yalnızca dizeden harfleri kaldıracaktır. Boşluk, köşeli ayraç, tırnak vb. Gibi diğer karakterler sonucun içinde tutulur. -> Bu çözümü yalnızca, giriş dizenizin yalnızca harf ve rakam içerdiğini ve başka karakter içermediğini biliyorsanız kullanın!
Philipp

-1

Middaparka yanıtın aynısı geçerlidir fakat kaldırmak,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);

Lütfen yazılarınıza blogunuza / sitenize bağlantılar eklemeyin. Bu spam olarak değerlendirilebilir.
Tushar

Downvote: Çünkü middaparka'nın cevabı mükemmeldi. OP noktaları ve virgülleri tutmak istiyor ama cevabınız onları kaldırıyor.
Carlos2W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.