文字列から数字以外の文字(ピリオドとコンマを除く)を削除する


150

次の値がある場合:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

新しい変数を作成して、コンマとピリオドを除いて、数値以外の文字が削除されたデータのコピーに設定するにはどうすればよいですか?上記の値は次の結果を返します。

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

回答:


335

次のように、preg_replaceを使用して、数字以外のすべての文字とコンマおよびピリオド/完全ストップを入れ替えることができます。

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

6
php function money_function()(php.net/manual/en/function.money-format.php)も参照してください
horatio

5
[^ 0-9]は数字以外の文字と一致するため、コンマと完全なストップを追加する必要はありません。これで十分です:echo preg_replace( '/ [^ 0-9] /'、 ''、$ testString);
billrichards 2014年

6
@billrichards正しいとは思いません。彼は数字を削除するのではなく、数字とともにコンマとフルストップを保持したいことを覚えておいてください。
Richt222 2014年

1
@billrichards OPが述べたように(私の強調)、「アルファベットまたはカンマとドット以外の文字は避けてください」。
ジョンパーカー

その期間はバックスラッシュを必要としませんか?ピリオドというのは「どんなキャラクター」でもないですか?
スコット

66

これはとても古い質問なので、ここでfilter_varについて言及されていないことに驚いています...

PHPには、サニタイズフィルターを使用してこれを行う組み込みのメソッドがあります。具体的には、この状況で使用FILTER_SANITIZE_NUMBER_FLOATするのはFILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDフラグを使用することです。そのようです:

$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に組み込まれているため、PHPの現在のライブラリで正規表現を使用するよりもわずかに高速です(文字どおりナノ秒単位です)。


2
IMOこれが最良の答えです。
Ogier Schelvis 16


4

を使用filter_varして、数字、ドット、およびカンマを除くすべての無効な文字を削除できます。

  • FILTER_SANITIZE_NUMBER_FLOATフィルタは、文字列からすべての非数値文字を削除するために使用されます。
  • FILTER_FLAG_ALLOW_FRACTION 分数区切りを許可しています " . "
  • FILTER_FLAG_ALLOW_THOUSAND文字列からカンマを取得する目的。

コード

$var1 = '12.322,11T';

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

出力

12.322,11

filter_var()およびサニタイズフィルターの詳細を読むには


2

リクエストがすべての(1つだけでなく)非数値文字を削除することである場合、おそらく前のコードをこのように非常に単純な方法で書くことができます(ただし、文字列を渡し、文字なしで必要な値を返すように関数を書くことができます) ..とにかく..):

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

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

1

文字が常に最初または最後にある場合は、単にトリムを使用するだけです...正規表現は必要ありません

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

重要:これにより、文字列から文字のみが削除されます。スペース、角かっこ、引用符などの他の文字は結果の中に保持されます。->このソリューションを使用するのは、入力文字列に文字と数字のみが含まれ、他の文字が含まれていないことがわかっている場合のみです。
フィリップ

-1

middaparkaと同じ答えですが,.

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

ブログ/サイトへのリンクを投稿に追加しないでください。これはスパムと見なすことができます。
Tushar 2016年

反対票:middaparkaの回答は完璧だったから。OPはドットとコンマを保持したいが、あなたの答えはそれらを削除します。
Carlos2W 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.