マルチバイト対応 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) "ひ"
  }
}
ソース
http://xif.jp/php/mbstring.phps


便利そうだと思って作ってみたけど、実際は滅多に使わなかった不遇の関数。
PHP 4 のマルチバイト正規表現自体、そもそも信用できない……というかトラウマが多すぎた。
preg で間に合うように設計してたのが実情。
ついでに mb_trim() mb_ltrim() mb_rtrim() も入ってます。