正規表現で全角カンマ/ピリオドを句読点に置換する(その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は数字すべてにマッチする。
[^....]
文字クラス内の否定。
文字クラス内“以外の”文字にマッチする。
(...)
サブパターン。
マッチングだけであれば不要だが、置換を行うために、マッチした部分文字列に番号を付けてやる必要がある。その場合にサブパターンを用いる。

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

 149: /**
 150:  * 「,」を「、」に、「.」を「。」に置換する
 151:  * @param   string $sour 元のテキスト
 152:  * @return  string 置換後テキスト
 153: */
 154: function myformat($sour) {
 155:     //合致パターン
 156:     $reg[1] = "([^0-90-9]),";
 157:     $reg[2] = ".([^0-90-9])";
 158:     $reg[3] = ".$";
 159:     //置換パターン
 160:     $rep[1] = "\\1、";
 161:     $rep[2] = "。\\1";
 162:     $rep[3] = "。";
 163: 
 164:     $dest = $sour;
 165:     foreach ($reg as $key=>$val) {
 166:         $dest = preg_replace("/{$val}/u", $rep[$key], $dest);
 167:     }
 168:     return $dest;
 169: }

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

活用例

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

参考サイト

(この項おわり)
header