正規表現で全角カンマ/ピリオドを句読点に置換する(その2)

(1/1)
前回の宿題を片付けよう。
全角小数で用いられる小数「.」や、整数部分の桁区切り文字である「,」については、句読点に変換しないようにする。これについても、場合分けすることなく、正規表現だけで解決できる。

(2021年8月16日)PHP8対応,リファレンスチェック改良

サンプル・プログラムの実行例

正規表現で全角カンマ/ピリオドを句読点に置換する(その2)

サンプル・プログラム

圧縮ファイルの内容
kutoten2.phpサンプル・プログラム本体

置換の考え方

次のように考えてみると、うまく行く。
  • カンマ「,」の扱い→アラビア数字の後に「,」が来ない場合には「、」に置換する。
  • ピリオド「.」の扱い→「.」の後にアラビア数字が来ない場合には「。」に置換する。


これを正規表現で表すと、前回同様、2つを別々に行うことになるが、
$str1 = ereg_replace("([^0-90-9]),", "\\1、", $str0);

$str2 = ereg_replace(".([^0-90-9])", "。\\1", $str1);
変数 $str0 にはオリジナルのテキストが入っているものとする。$str1 を作業用変数として、置換後のテキストは $str2 である。

今回使った正規表現

[...]
文字クラス。
この中に記述された文字の並びのうちの1文字を表す。
-
文字の範囲指定。
a-z はアルファベット小文字すべてに、0-9は数字すべてにマッチする。
[^....]
文字クラス内の否定。
文字クラス内“以外の”文字にマッチする。
(...)
サブパターン。
マッチングだけであれば不要だが、置換を行うために、マッチした部分文字列に番号を付けてやる必要がある。その場合にサブパターンを用いる。

サンプル・プログラムの解説

0149: /**
0150:  * 「,」を「、」に、「.」を「。」に置換する
0151:  * @param   string $sour元のテキスト
0152:  * @return  string 置換後テキスト
0153: */
0154: function myformat($sour) {
0155:     //合致パターン
0156:     $reg[1] = "([^0-90-9]),";
0157:     $reg[2] = ".([^0-90-9])";
0158:     $reg[3] = ".$";
0159:     //置換パターン
0160:     $rep[1] = "\\1、";
0161:     $rep[2] = "。\\1";
0162:     $rep[3] = "";
0163: 
0164:     $dest = $sour;
0165:     foreach ($reg as $key=>$val) {
0166:         $dest = preg_replace("/{$val}/u", $rep[$key]$dest);
0167:     }
0168:     return $dest;
0169: }

サンプル・プログラムのフローは、前回とまったく同じである。置換を行うためにユーザー関数 myform を変更しただけだ。

活用例

みんなの知識 ちょっと便利帳では、「全角ピリオド/カンマを句読点に変換」「句読点を全角ピリオド/カンマに変換」「読点を全角カンマに変換」のコーナーで、このサンプル・プログラムを活用している。ありがとうございます。

参考サイト

(この項おわり)
header