[PHP-users 1980] Re: シングルバイト文字とマルチバイト文字の分割

Toshikazu Yoshikawa php-users@php.gr.jp
Tue, 11 Sep 2001 14:21:41 +0900


吉川@アンカットです。
重松様、早速のお返事ありがとうございます。

> (1) JIS に変換して、explode()。
>
> (snip)
>
> (2) mbereg() を使う。

せっかくお返事をいただいたのですが、preg_sprit()で解決しました。
PHP-4.0.5以上でないと動かず、考え方も若干邪道のような気がしますが、
シングルバイト文字は0x20(スペース)〜0x7e(チルダ)の範囲にあるものとして、
以下のスクリプトを書きました。
改行コード等はあらかじめ取り除いておくものとします。

<?php
$str = "日本語とEnglishの混在したtextです";

$buf = preg_split ("/([ -~]+)/", $str, -1,
             PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

for ($i = 0;$i < count ($buf);$i++)    print $buf[$i]."<BR>\n";
?>

シングルバイト文字の連続したものをデリミタにし、
(EUCは第1第2バイトとも0xA1〜0xFFなので引っかからない)
4.0.5以上で追加されたPREG_SPLIT_DELIM_CAPTUREフラグを使って、
デリミタも返してもらうという戦略です。

結果はめでたく

------------
日本語と
English
の混在した
text
です
------------

となりました。
mb_convert_kana()のような関数もあるので、すぐにできるかと思ったんですが、
意外にハマりました。

---
unCut Technology
Toshikazu Yoshikawa
mailto:yoshikawa@uncut.co.jp