PHPで文字列から数字を抽出
たとえば何か規則性のある大量のデータ(CSV、JSON)がある場合、番号を表してるけど余計な文字列も入っているケースは少し厄介です。
▼ そういうデータの例
- "ワンピース 第87巻"
- "鬼滅の刃 16巻"
- "こち亀 第百十三巻"
こういった大量のデータがあり、そこで「第87巻」なら「87」というように数字部分だけ抜き出したかったです。(全角・漢数字でも同じことがしたかった・・・)
その方法をコード例と一緒に記録します。
ただし小数点などには対応していません。
方法1.抽出対象が半角数字のみの場合
まずは半角数字のみの場合について。
これは正規表現を使えば簡単ですね。
▼ このようなコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span style="vertical-align: inherit;"><span style="vertical-align: inherit;">$コミック= [</span></span> [ 'title'=> 'ワンピース', 'volume_number' => '第87巻' ],<span style="vertical-align: inherit;"><span style="vertical-align: inherit;"> [</span></span> 'title'=> '鬼滅の刃', 'volume_number' => '第16巻' ], [ 'title'=> 'こち亀', 'volume_number' => '第百十三巻' ] ]; for($i = 0; $i < count($comics); $i++){ $comic = $comics[$i]; $title = $comic['title']; $vol_num = $comic['volume_number']; preg_match('/([0-9]+)/', $vol_num, $matches); $volume_number = $matches[0]; echo "$title : $volume_number"; } |
▼ このコードの出力結果
1 2 3 |
ワンピース : 87 鬼滅の刃 : こち亀 : |
当然ながら「第16巻」とか「第百十三巻」などの数字は抽出できていません。純粋に半角数字だけを抜き出すならこれでもOKだけど...
方法2.全角数字も対象にして文字列から数字抽出
範囲を広くして全角数字も対象に
そういう場合は次のようなコードで可能です。
▼ こういうコードを書いてみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$comics = [ [ 'title'=> 'ワンピース', 'volume_number' => '第87巻' ], [ 'title'=> '鬼滅の刃', 'volume_number' => '第16巻' ], [ 'title'=> 'こち亀', 'volume_number' => '第百十三巻' ] ]; for($i = 0; $i < count($comics); $i++){ $comic = $comics[$i]; $title = $comic['title']; $vol_num = $comic['volume_number']; $vol_num = mb_convert_kana($vol_num, 'kvrn'); preg_match('/([0-9]+)/', $vol_num, $matches); $volume_number = $matches[0]; echo "$title : $volume_number"; } |
▼ このコードの出力結果
1 2 3 |
ワンピース : 87 鬼滅の刃 : 16 こち亀 : |
ポイントは mb_convert_kana($vol_num, 'kvrn') のように全角を半角に変換することです。第2引数が変換時のオプション文字列
詳しくは次のPHPマニュアルを見てください。
これで全角数字でも抽出ができるように
普通の用途ならこれで十分ですね。
方法3.漢数字も対象にして文字列から数字抽出
これは一筋縄でいかない難しい問題
でも解決策はあって、先人が「漢数字 ⇒ 半角数字」に変換するためのスクリプトを公開されていました。これで漢数字にも対応できます。
▼ ここで公開されているスクリプト
たとえば「十二万三千四百五十六」という漢数字があるなら、それを「123456」という風にスマートに解釈して変換してくれます。
これを使えば漢数字の抜き出しも可能です。
▼ こういうコードを書いてみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$comics = [ [ 'title'=> 'ワンピース', 'volume_number' => '第87巻' ], [ 'title'=> '鬼滅の刃', 'volume_number' => '第16巻' ], [ 'title'=> 'こち亀', 'volume_number' => '第百十三巻' ] ]; for($i = 0; $i < count($comics); $i++){ $comic = $comics[$i]; $title = $comic['title']; $vol_num = $comic['volume_number']; $vol_num = mb_convert_kana($vol_num, 'kvrn'); preg_match('/([0-9]+)/', $vol_num, $matches); if(count($matches) !== 0){ $volume_number = $matches[0]; }else{ $volume_number = kan2num($vol_num, 3); } echo "$title : $volume_number"; } |
▼ このコードの出力結果
1 2 3 |
ワンピース : 87 鬼滅の刃 : 16 こち亀 : 113 |
このコードの kan2num($vol_num, 3); というのが公開されているスクリプトで定義されている関数です。この使い方は作者様のHPをご覧ください。
文字列から数字だけ抽出する方法のまとめ
用途に応じて次の3つが使用可能
もし間違いなどあればご指摘ください。
以上、PHPによる数字抽出でした。ではまた