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

(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 文字プロパティを使うことにする。

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

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

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

0189: /**
0190:  * 漢字=半角英数字の間に半角スペースを挿入する
0191:  * @param   string $sour   変換前文字列
0192:  * @param   string $mode  'space' \x20を挿入する/'html'  を挿入する
0193:  * @return  string変換後文字列
0194: */
0195: function add_space($sour$mode) {
0196:     $sp = ($mode == 'html') ? ' ' : ' ';
0197:     //合致パターン
0198:     $reg[1] = '/([0-9A-Za-z]+)([\p{Han}\p{Hiragana}\p{Katakana}]+)/u'; //Ver.2.1
0199:     $reg[2] = '/([\p{Han}\p{Hiragana}\p{Katakana}]+)([0-9A-Za-z]+)/u'; //Ver.2.1
0200:     //置換パターン
0201:     $rep[1] = "$1{$sp}$2";
0202:     $rep[2] = "$1{$sp}$2";
0203: 
0204:     $dest = $sour;
0205:     foreach ($reg as $key=>$val) {
0206:         $dest = preg_replace($val$rep[$key]$dest);
0207:     }
0208: 
0209:     return $dest;
0210: }

活用例

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

参考サイト

(この項おわり)
header