不定形の文字列中の数字部分を抽出してちょっと計算したいんだけど、
1000桁みたいなint型やdouble型に変換したらややこしくなるレベルの桁数が出てきたら
面倒くさくなるからそれは除いて検索しようってなったときにちょっとハマったからメモ。
\d{1,5}とかやっても1234567890とかが出てきたら12345と67890で分かれてマッチしちゃうし
どうしようって思ってたところ、
search_number.php
$number_text =
'999999999999999999
19
18782
999999999999999999999
18782
777
999999999999999999999999
37564
1hoge22bar333foo4444fuga55555piyo666666bora7777777toto88888888';
$pattern = '/(?<!\d)\d{1,5}(?!\d)/';
preg_match_all($pattern, $number_text, $result);
var_dump($result);
//結果↓
// array(1) {
// [0]=>
// array(10) {
// [0]=>
// string(2) "19"
// [1]=>
// string(5) "18782"
// [2]=>
// string(5) "18782"
// [3]=>
// string(3) "777"
// [4]=>
// string(5) "37564"
// [5]=>
// string(1) "1"
// [6]=>
// string(2) "22"
// [7]=>
// string(3) "333"
// [8]=>
// string(4) "4444"
// [9]=>
// string(5) "55555"
// }
// }
どうやらこれで行けたっぽい
簡単な解説
正規表現
'/(?<!\d)\d{1,5}(?!\d)/'
\d{1,5} = 1文字以上5文字以内の半角数字
(?<!\d) = 直前が半角数字でない
(?!\d) = 直後が半角数字でない
否定先読みとか否定後読みとかのアレですね。