PHPプログラミング

最終更新日:
公開日:

レシピ

文字列

文字列から数字以外を削除する

preg_replace関数で正規表現を使い、文字列から数字以外を削除して数字だけの文字列を取り出す方法について解説します。

この記事のポイント

  • preg_replace関数で指定する正規表現ではUnicodeの文字プロパティを使う
  • 数字を全角/半角のいずれかに統一するときはmb_convert_kana関数を使う
  • 文字列に数字以外の文字列が含まれるか確認するときはpreg_match関数を使う

数字以外を削除する

文字列に数字とそれ以外の文字が混在しているとき、正規表現とpreg_replace関数を使って数字だけを取り出すことができます。
以下の例では6種類の文字列から数字以外の文字を削除しています。

index.php

<?php

$str1 = '12345'; // 数字のみ
$str2 = 'Test4492Numnber'; // アルファベットと数字
$str3 = '090-1111-2222'; // 電話番号:数字の間に「-」が入る
$str4 = '123-4567'; // 郵便番号:数字の間に「-」が入る
$str5 = '数字以外の42文字を5削除5221する'; // 日本語と数字
$str6 = '01234512345'; // 全角、半角が混ざった数字

$str1 = preg_replace( '/[^\p{Nd}]/u', '', $str1);
$str2 = preg_replace( '/[^\p{Nd}]/u', '', $str2);
$str3 = preg_replace( '/[^\p{Nd}]/u', '', $str3);
$str4 = preg_replace( '/[^\p{Nd}]/u', '', $str4);
$str5 = preg_replace( '/[^\p{Nd}]/u', '', $str5);
$str6 = preg_replace( '/[^\p{Nd}]/u', '', $str6);

var_dump( $str1 ); // string(5) "12345"
var_dump( $str2 ); // string(5) "4492"
var_dump( $str3 ); // string(5) "09011112222"
var_dump( $str4 ); // string(5) "1234567"
var_dump( $str5 ); // string(5) "4255221"
var_dump( $str6 ); // string(5) "01234512345"

preg_replace関数は第1パラメータに正規表現を「/〜/」で囲って指定し、該当する文字列は第2パラメータの空白に置き換えることで削除します。
正規表現の条件は「数字以外の文字列」になるので、否定の「^」とUnicodeの文字プロパティで10進数の数字にマッチする「\p{Nd}」を組み合わせて指定します。

条件の末尾についているuは正規表現をUTF-8として処理するための指定です。

以上の条件で文字列の置き換えを行うと数字のみ取り出すことができますが、上記の変数$str6では全角と半角の数字が混ざった状態になります。
もし全角/半角のいずれかに統一したい場合はmb_convert_kana関数を使って変換することができます。

index.php

<?php

$str6 = '01234512345';
$str6 = preg_replace( '/[^\p{Nd}]/u', '', $str6);

// 半角数字にする
$str6 = mb_convert_kana( $str6, 'n', 'UTF-8');
var_dump( $str6 ); // string(11) "01234512345"

// 全角数字にする
$str6 = mb_convert_kana( $str6, 'N', 'UTF-8');
var_dump( $str6 ); // string(33) "01234512345"

mb_convert_kana関数は第2パラメータで指定した値に応じて、第1パラメータの文字列を一括で全角/半角変換することができます。
こちらの関数について詳しくは「文字の半角/全角表記を整える」を参照ください。

もし文字列に数字以外の文字列が含まれるか確認したいときは、preg_match関数を使って確認できます。
こちらの関数は指定した正規表現にマッチする文字が含まれるか確認を行いますが、正規表現はpreg_replace関数で使うものと同じものを指定します。

index.php

<?php

$str4 = '123-4567';

// 数字以外の文字列があるか確認する
if( preg_match( '/[^\p{Nd}]/u', $str4) ) {

	 $str4 = preg_replace( '/[^\p{Nd}]/u', '', $str4);

}