アフィリエイト広告を利用しています
検索
<< 2024年11月 >>
          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 28 29 30
最新記事
タグクラウド
カテゴリーアーカイブ
ファン
最新コメント
プロフィール
ゼロから始めるシステム開発さんの画像
ゼロから始めるシステム開発
 こんにちは!ナビゲータのEVEです。各種研究室を用意し、次期EVEシステムを製造しようと日々頑張っています。現在一番力を入れているのが、資金調達です。このブログもその一環ですので、ご協力いただければ嬉しいです。
プロフィール

2024年02月22日

PHPにおける正規化表現 〜プログラミング研究室〜

 こんにちは!
 ナビゲータのEVEです。
PHP.jpg
 では、本日は、早速正規表現について見ていきましょう!

[正規表現]
 昨日のおさらいになりますが、正規表現とは、いろいろな入力データを、一定の規則に基づき、統一的な表現で出力するものです。
 例えば、株式データを扱う場合、1株10円台から数十万円単位の株式までいろいろあります。1株10円、100円程度の株なら一目でいくらか分かるのですが、1株数十万円の場合、カンマで区切られていないとわかりません。そのため、1株千円以上の株価は、3桁ずつに区切りたいというニーズが生まれます。その時などに利用するのが、正規表現です。

[正規表現の実際]
 では、実際に、数値123456789をカンマ区切りする、正規表現を見ていきましょう!

/(\d)(?=(\d{3})+$)/


ただ、数字を3桁ずつに区切りたいだけなのに複雑な作りになっています。
 昨日、以上の正規表現には、メタ文字が使われ、そのメタ文字には、以下のようなモノがあるという話をしています。

\ 多目的に使う一般的なエスケープ文字
^ 検索対象(複数行モードでは行)の始まりを言明
$ 検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明
. 改行を除くすべての文字にマッチ(デフォルト時)
[ 文字クラス定義の開始
] 文字クラス定義の終了
| 選択肢の開始
( サブパターンの開始
) サブパターンの終了
? ( の意味を拡張/0 または 1 回マッチ/なるべく少ない回数だけマッチ
* 0 回以上の繰り返し
+ 1 回以上の繰り返し
{ 最小/最大を指定する量指定子の開始
} 最小/最大を指定する量指定子の終了
/ メタ文字の開始と終了を示す。
\ メタ文字の開始と終了を示す。
出典元 【5分でまるっと理解】PHP正規表現の使い方まとめ(エンジニアの入り口)


以上の情報からどのようなことをしているのか、見ていきましょう!なお、最初のスラッシュ(/)なのですが、メタ文字の開始と終了を意味します。そして、最後のuは、、UTF-8エンコーディングを使用している場合に、正規表現のパターンを適切に処理するために必要な表現だそうです。通常、PHPで利用する関数は、UTF-8に対応しているため、最後のuは、呪文のように定義する必要があります。私の開発環境は、すべて、UTF-8で構成されていますが、Windowsで開発している人で、SHIFT-JISを標準文字コードとしている場合は、まず文字コードをUTF-8に変換したうえで、正規表現を利用しないと、想定しない出力結果になります。
 \B は、単語境界の直前や直後ではない位置を示す特殊なマッチング条件です。この記述がないと、3桁の数値の位置は特定できるのですが、特定後改行されてしまいます。
 続きまして、\Bのサブパターンの開始を意味する、カッコ"()"の中身を見ていきましょう!
 カッコ内の最初の?は、マッチングパターンである続くカッコの中身を指しています。それ以降については、\dは、数値を指しており、鍵カッコ"{}"はその数値の桁数を指しています。ちなみに、dは、digit(数字)を指しています。
 そして、+は、(\d{3})が1回以上繰り返されることを意味しています。
 最後に、(?!\d)は、?を説明している(\d{3})の否定語読みとなり、(\d{3})のパターン直後は続かないという条件を指します。ちなみに、エクスクラメーション(!)は、メタ文字ではなく、演算子です。
 以上で、正規表現をすべて説明しましたが、分かりましたでしょうか?ちなみに、この表現の中では、カンマ(,)は表現されておらす、これから紹介する、関数により提供されるモノらしいです。そこが、ちょっと、分かりにくい・・・。

[PHPで利用する正規表現関数]
 PHPでは、以下の2関数を用いて、正規表現したパラメータを処理します。

preg_replace
preg_match


多分以下のようなロジックで、数値を3桁区切りで表示できると思われます。

$number = 12345678
echo preg_replace('/\B(?=(\d{3})+(?!\d))/u', ',', $number);


出力結果は、

123,456,789

となります。

[あとがき]
 やっぱり、複雑・・・。ChatGPTに解説してもらわないともしかしたら、理解できなかったかもしれません。なお、メタ文字に関する情報を、【5分でまるっと理解】PHP正規表現の使い方まとめ(エンジニアの入り口)を見て提供しましたが、今回の調査で情報が不足していることが分かりました。追加した情報については、青字で記していますので、ご確認ください。
 まっ、書き終わってからなんですが、数値を3桁に区切って表示したいだけの場合、number_format()を利用すべきです。この関数だと数値を入力するだけで、数値を3桁ごとに区切って表示してくれます。ちなみに、カンマ区切りになった数値は、整数ではなく、文字列となることには、注意が必要です。

 では、また!
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/12438721
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック