[PHP-users 11688] Re: 文字列のマッチングについて

Osamu Shigematsu php-users@php.gr.jp
Fri, 22 Nov 2002 09:22:07 +0900


重松です。こんにちは。

On Friday, Nov 22, 2002, at 05:16 Asia/Tokyo, Moriyoshi Koizumi wrote:

> mb_ereg 系列は Shift_JIS でも問題なく使えます。
> あとは、内部エンコーディングが UTF-8 でもよければ preg系も大丈夫みたいです。
>
> # ereg 系も EUC だから必ずしも大丈夫ということはありません。
>
> (例) $result = preg_match("/日本語/u", "これは日本語ですか?");
>
> "u" をつけてください。"U"(大文字) ではありません。

これは知りませんでした。
# source ちゃんと読めよ。> 自分

> 蛇足ですが、実は、ソースを見る限りではテーブルを追加するだけで
> pcre を UTF-8 以外のマルチバイト文字に対応できるようなんですけど、
> なにしろそのあとが面倒なので…。こんな感じになりそうですし。

この辺少し脱線しますが、multibyte 文字環境における [] の実装って、
どのように最適化されているのでしょうか。

例えば、ctype のように、

	const static int ctype_map[256] = { 0, .... 続く

のような表を抱えておき、

	int match = ctype_map[char_index] & bit_mask;

のようにできればそれは速いでしょうが。
# 上記は、Metroweks CodeWarrior での実装例です。今は違うかも。

個人的には、[A-Zあ-んア-ン] だと、([A-Z]|[あ-んア-ン]) のように、
まず、バイト数ごとに分割して、その後に、[あ-ん][ア-ン] の部分を、
([あ-ん]|[ア-ン]) として、

	あ = \xa4\xa2	ア = \xa5\xa2
	ん = \xa4\xf3 ン = \xa5\xf3

なので、([A-Z]|\xa4[\xa2-\xf3]|\xa5[\xa2-\xf3]) とすればいいのかなと。

あとは、JIS にどうやって対処するのかが問題です。

# いえ、.qmail で Subject で filter したいんだけど、
# コーディングが楽で、軽い方法はないものかと...。
# iftocc では既に不足。

-- 
Osamu Shigematsu