正規表現で日本語と半角英数字の間にスペースを挿入する

(1/1)
テキスト中に全角文字と半角文字が混在していると、その間が詰まって見にくいことがある。そこで、ホームページなどでも、全角文字と半角文字の間に半角スペースを挿入することがよく行われる。
いちいち手作業で半角スペースを挿入するのも面倒なので、今回は、PHP で自動的に半角スペースを挿入するプログラムを作ってみることにする。

(2021年8月16日)PPHP8対応,リファラ・チェック改良

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

正規表現で日本語と半角英数字の間にスペースを挿入する

サンプル・プログラム

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

プログラムの方針

入力したテキスト中に、次のようなパターンが現れたら、半角スペース(■)を挿入する。
  • 半角英数字が1つ以上並んでいる■日本語文字が1つ以上並んでいる
  • 日本語文字が1つ以上並んでいる■半角英数字が1つ以上並んでいる


ところで、本シリーズのプログラムは内部のテキスト処理を UTF-8 で行うようにしているのだが、「Unicode=古今東西のあらゆる文字を収録」で紹介したように、UTF-8 のベースとなっている UnicodeJISコード と違って漢字の範囲を指定しにくい。

一方、PHPの正規表現は、Unicode 文字プロパティとして、あらたなエスケープシーケンスが導入されている。
たとえば、 \p{Han} は漢字1文字に、\p{Hiragana} は平仮名1文字に、\p{Katakana} はカタカナ1文字に、それぞれマッチする。
そこで、冒頭のパターンのマッチングには、Unicode 文字プロパティを使うことにする。

(※)特定の漢字でスペースが入らないことを「みんなの知識 ちょっと便利帳」管理者様からご指摘をいただき、漢字の範囲指定が甘かったことに気づきました。ありがとうございます。

解説:漢字=半角英数字の間に半角スペースを挿入する

サンプル・プログラムのフローは、「全角カンマ/ピリオドを句読点に置換する」で処理したのとまったく同じである。正規表現のパターンを「プログラムの方針」で紹介したものに変更している。

 189: /**
 190:  * 漢字=半角英数字の間に半角スペースを挿入する
 191:  * @param   string $sour   変換前文字列
 192:  * @param   string $mode  'space' \x20を挿入する/'html'  を挿入する
 193:  * @return  string 変換後文字列
 194: */
 195: function add_space($sour, $mode) {
 196:     $sp = ($mode == 'html'? ' ' : ' ';
 197:     //合致パターン
 198:     $reg[1] = '/([0-9A-Za-z]+)([\p{Han}\p{Hiragana}\p{Katakana}]+)/u';  //Ver.2.1
 199:     $reg[2] = '/([\p{Han}\p{Hiragana}\p{Katakana}]+)([0-9A-Za-z]+)/u';  //Ver.2.1
 200:     //置換パターン
 201:     $rep[1] = "$1{$sp}$2";
 202:     $rep[2] = "$1{$sp}$2";
 203: 
 204:     $dest = $sour;
 205:     foreach ($reg as $key=>$val) {
 206:         $dest = preg_replace($val, $rep[$key], $dest);
 207:     }
 208: 
 209:     return $dest;
 210: }

活用例

日本語全角文字と半角英数字の間に半角スペースを入れる」(みんなの知識 ちょっと便利帳)では、このサンプル・プログラムを活用し、半角スペース( )のほか、狭いスペース( )を挿入できるようにしています。ありがとうございます。

参考サイト

(この項おわり)
header