マルチバイト対応 preg_match_all
他に書くこと考えなきゃなあ。
preg_match_all() のマルチバイト文字列版、 mb_ereg_all() 。
- 第 3 引数が省略できない。 (PHP 4 対応の為)
- PREG_OFFSET_CAPTURE 未対応。
- 確か、やたら面倒になりそうだったから。覚えてない。
<?php // coding: UTF-8 require 'mbstring.php'; mb_internal_encoding('UTF-8'); mb_regex_encoding('UTF-8'); $string = <<<EOS 色は匂へど 散りぬるを 我が世誰ぞ 常ならん 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず EOS; $pattern = '([あ-ん])[あ-ん]*'; $count = mb_ereg_all($pattern, $string, $matches, PREG_PATTERN_ORDER, 0); var_dump($count, $matches);
int(11) array(2) { [0]=> array(11) { [0]=> string(3) "は" [1]=> string(6) "へど" [2]=> string(12) "りぬるを" [3]=> string(3) "が" [4]=> string(3) "ぞ" [5]=> string(9) "ならん" [6]=> string(3) "の" [7]=> string(6) "えて" [8]=> string(3) "き" [9]=> string(3) "じ" [10]=> string(12) "ひもせず" } [1]=> array(11) { [0]=> string(3) "は" [1]=> string(3) "へ" [2]=> string(3) "り" [3]=> string(3) "が" [4]=> string(3) "ぞ" [5]=> string(3) "な" [6]=> string(3) "の" [7]=> string(3) "え" [8]=> string(3) "き" [9]=> string(3) "じ" [10]=> string(3) "ひ" } }
便利そうだと思って作ってみたけど、実際は滅多に使わなかった不遇の関数。
PHP 4 のマルチバイト正規表現自体、そもそも信用できない……というかトラウマが多すぎた。
preg で間に合うように設計してたのが実情。
ついでに mb_trim() mb_ltrim() mb_rtrim() も入ってます。