文字列から数値を抽出する


332

次のような数字と文字を含む文字列から数字を抽出したい:

"In My Cart : 11 items"

ここで、番号11またはその他の番号を取得します。


これを使用する$ string = "カート内:11アイテム"; $ number = preg_replace( "/ [^ 0-9] {1,4} /"、 ''、$ string); // 11を返す
Shorabh

回答:


363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);

2
配列ではなく単純な変数で番号を取得するにはどうすればよいですか?
ビズボス

34
$ var = implode( ''、$ matches [0]);
Gaurav

2
@Bizboss同様に、を試してください$newstr = preg_replace('!\d+!', '', $str);。文字列からすべての数字を取り除きます。例:$str = 'In My Cart : 11 12 items';が出力されますIn My Cart : items
オード

77
thiはリソースにやさしい方法ではありません。使用preg_replace("/[^0-9]/","",$string);またはfilter_var($str, FILTER_SANITIZE_NUMBER_INT);
EAPO

6
@eapoがfilter_var($str, FILTER_SANITIZE_NUMBER_INT);抽出した数字、プラス記号とマイナス記号。正規表現は数字のみを抽出しました!
PATROMO

537

数字以外のすべてをフィルタリングしたい場合は、最も簡単な方法はfilter_varを使用することです。

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);

56
数字の前のダッシュはマイナスとして扱われます。
Elnur Abdurrakhimov

43
数だけではありません。+/-は切り捨てられません。あなたが持っているxxx-yyy-24なら、あなたは得るでしょう--24str_repleace(array('+','-'), '', $result)両方の標識を削除するために使用できます。
imclickingmaniac 2013年

4
@imclickingmaniac max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))では、代わりに配列と文字列置換を使用するだけで実行できます。
エデュアルド2013年

2
max()を使用すると、文字列にマイナス記号も返されます。strreplace()がここでのオプションであることを期待してください。ヒントをありがとう。
Shiva Avula 2013

26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU 2015

300
preg_replace('/[^0-9]/', '', $string);

これはもっとうまくいくはずです!...


10
preg_match_allの例のような配列ではなく文字列を返すため、これが好きです。filter_varの例のように、プラス記号やダッシュではなく、数値だけが必要なため、気に入っています。
ダレルデュアン

43
この方法には注意してください: 'In My Car_Price:500.00will print:50000
ErickBest

16
@ErickBest質問を考えると、それは良いことですextract the numbers from a string-小数点は数値ではありません!
rybo111 2014

1
これはちょっとしたことですが、おそらく'二重引用符ではなく一重引用符を使いたいでしょう"
CommandZ 2015

16
preg_replace( '/ [^ 0-9。] /'、 ''、 'abc1.22'); // 10進数の1.22を返します
zzapper '25

84

使用preg_replace

$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;

出力:1111111111


4
それは素晴らしい働きをしています。+387 (61) 634-783文字列を38761634783直接に変換します。Gauravの回答のように配列を処理する必要はありません。
ベイタロフスキー2016

1
間違いなく最良の答えです。sandbox.onlinephpfunctions.com/code/...
ステファン

+より長い一致/より少ない置換に一致するように数量詞をお勧めします。
mickmackusa

21

浮動小数点数の場合、

preg_match_all('!\d+\.?\d+!', $string ,$match);

間違いを指摘してくれてありがとう。@mickmackusa


それは実際には間違っています:)それはあるはずです'!\d*.?\d+!'
Yash

?リテラルドットの数量詞として使用したいと思います。float値に複数の小数点記号が含まれるとは思いません。ヤシュのコメント付きパターンは皮肉にも間違っている。ドットをリテラルにするためには、ドットの前にスラッシュが必要です。
mickmackusa

11

私はこれに対するクレジットを所有していませんが、共有するだけです。この正規表現は、小数点/場所とコンマを含む文字列から数値を取得します。

/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/

ここから引用:
php-regex-文字列(例:1,120.01)から小数(ドットとコンマ)を含む数値を抽出する方法


これは、3つの整数のセット間のコンマの文字列を検証していません。...他の人のパターンをコピーして貼り付け、それを理解またはテストできないという問題。
mickmackusa



6

次の関数を使用できます。

function extract_numbers($string)
{
   preg_match_all('/([\d]+)/', $string, $match);

   return $match[0];
}

\d文字クラスの内部で書くことには何の利点もありません。フルストリングの一致にアクセスしているため、パターンにキャプチャグループを書き込んでも意味がありません。
mickmackusa

4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

この特定のケースでの内破の最初の引数は、「matches [0]の各要素を1つのスペースで区切る」と述べています。Implodeは、最初の数値の前または最後の数値の後にスペース(または最初の引数が何であれ)を入れません。

$ matches [0]は、見つかった一致の配列(この正規表現に一致する)が格納される場所です。

配列内の他のインデックスが何であるかの詳細については、http//php.net/manual/en/function.preg-match-all.phpを参照してください。


4

これを試して、preg_replaceを使用してください

$string = "Hello! 123 test this? 456. done? 100%";
$int = intval(preg_replace('/[^0-9]+/', '', $string), 10);
echo $int;

デモ


[^0-9]より単純にと書かれてい\Dます。
mickmackusa

3
$value = '25%';

または

$value = '25.025$';

または

$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

これは数値のみを返します



3

この手順に従って、文字列を数値に変換します

$value = '$0025.123';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
settype($onlyNumeric,"float");

$result=($onlyNumeric+100);
echo $result;

それを行う別の方法:

$res = preg_replace("/[^0-9.]/", "", "$15645623.095605659");

0

他の方法(Unicode文字列も):

$res = array();
$str = 'test 1234 555 2.7 string ..... 2.2 3.3';
$str = preg_replace("/[^0-9\.]/", " ", $str);
$str = trim(preg_replace('/\s+/u', ' ', $str));
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++) {
    if (is_numeric($arr[$i])) {
        $res[] = $arr[$i];
    }
}
print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 ) 

0

このスクリプトは、最初にファイルを作成し、行に数字を書き込み、数字以外の文字を取得した場合は次の行に変更します。最後に、再び番号をリストに並べ替えます。

string1 = "hello my name 12 is after 198765436281094and14 and 124de"
f= open("created_file.txt","w+")
for a in string1:
    if a in ['1','2','3','4','5','6','7','8','9','0']:
        f.write(a)
    else:
        f.write("\n" +a+ "\n")
f.close()


#desired_numbers=[x for x in open("created_file.txt")]

#print(desired_numbers)

k=open("created_file.txt","r")
desired_numbers=[]
for x in k:
    l=x.rstrip()
    print(len(l))
    if len(l)==15:
        desired_numbers.append(l)


#desired_numbers=[x for x in k if len(x)==16]
print(desired_numbers)

-1

ユースケースによっては、これもオプションになる場合があります。

$str = 'In My Cart : 11 items';
$num = '';

for ($i = 0; $i < strlen($str); $i++) {

    if (is_numeric($str[$i])) {
        $num .= $str[$i];
    }
}

echo $num; // 11

正規表現に同意するかfilter_var()、記載されているケースではより役立つでしょう。


-1

utf8 strの場合:

function unicodeStrDigits($str) {
    $arr = array();
    $sub = '';
    for ($i = 0; $i < strlen($str); $i++) { 
        if (is_numeric($str[$i])) {
            $sub .= $str[$i];
            continue;
        } else {
            if ($sub) {
                array_push($arr, $sub);
                $sub = '';
            }
        }
    }

    if ($sub) {
        array_push($arr, $sub); 
    }

    return $arr;
}

-1

番号の形式がわからない場合は、intまたはfloatingの場合、これを使用してください:

$string = '$125.22';

$string2 = '$125';

preg_match_all('/(\d+.?\d+)/',$string,$matches); // $matches[1] = 125.22

preg_match_all('/(\d+.?\d+)/',$string2,$matches); // $matches[1] = 125

-1

この関数は浮動小数点数も処理します

$str = "Doughnuts, 4; doughnuts holes, 0.08; glue, 3.4";
$str = preg_replace('/[^0-9\.]/','-', $str);
$str = preg_replace('/(\-+)(\.\.+)/','-', $str);
$str = trim($str, '-');
$arr = explode('-', $str);

このプロセスにハイフンを導入する必要はまったくありません。この答えには、それがどのように機能するか、なぜそれが良いアイデアであると感じるのかについての説明が欠けています。
mickmackusa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.