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

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

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

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

サンプル・プログラム

プログラムの方針

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


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

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

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

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

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

0079: /**
0080:  * 漢字=半角英数字の間に半角スペースを挿入する
0081:  * @param string $sour   変換前文字列
0082:  * @param string $mode 'space' \x20を挿入する/'HTML'  を挿入する
0083:  * @return string 変換後文字列
0084: */
0085: function add_space($sour$mode) {
0086:     $sp = ($mode == 'html') ? ' ' : ' ';
0087:     //合致パターン
0088:     $reg[1] = '/([0-9A-Za-z]+)([\p{Han}\p{Hiragana}\p{Katakana}]+)/u';   //Ver.2.1
0089:     $reg[2] = '/([\p{Han}\p{Hiragana}\p{Katakana}]+)([0-9A-Za-z]+)/u';   //Ver.2.1
0090:     //置換パターン
0091:     $rep[1] = "$1{$sp}$2";
0092:     $rep[2] = "$1{$sp}$2";
0093: 
0094:     $dest = $sour;
0095:     foreach ($reg as $key=>$val) {
0096:         $dest = preg_replace($val$rep[$key]$dest);
0097:     }
0098: 
0099:     return $dest;
0100: }

活用例

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

参考サイト

(この項おわり)
header