[PHP-users 12718] Re: mb_regex_set_options()の引数って?

Moriyoshi Koizumi php-users@php.gr.jp
Wed, 22 Jan 2003 08:14:44 +0900


小泉です。

On Tue, Jan 21, 2003 at 08:21:35PM +0900, Y.Watanabe wrote:
> わたなべです。
> 
> どなたか、
>   mb_regex_set_options
>   http://www.php.net/manual/ja/function.mb-regex-set-options.php
> の引数の書き方ってご存知ないですか?
> //マニュアルはまだ完全じゃないみたいなので・・・
> 

============================================================================
mbregex オプションについて

"i" "x" "m" "s" "p" "e" の文字の組合せを指定します。

Ruby 互換 (どのバージョンと互換かは失念) とのことなので、
そちらに馴染みのある方はすぐにお分かりになると存じます。

"i" - 英文字の大小を無視します。全角英文字はこのオプションと無関係だったか
      と思います。ただ、文字が大きいか小さいかが何によって決定されているの
      かはそれほどソースを読み込んでいないので、よく分かりません。
      ロカール依存でしょうか?とにかくここは他の mbstring 関数と首尾一貫し
      ていない点です。

"x" - 拡張正規表現モードを有効にします。このモードでは、「素」の(文字クラ
      スで表現されていない)改行やスペースは無視され、さらに、"#" で始まる
      行はコメントとして扱われます。

"s" - 入力を単一の行から構成されたテキストとみなします。
      つまり、"^" や "$" の扱いがそれぞれバッファの始端と終端に変わります。
      "m" オプションと組合せもできます。

"m" - 改行 "\n" が "." にマッチするようになります。 
      つまり、

      // 結果 abc\ndef\n
      print mb_ereg_replace('...$.', '--', "abc\ndef\n", "");

      // 結果 ---- 
      print mb_ereg_replace('...$.', '--', "abc\ndef\n", "m");

"p" - POSIX もどき正規表現モードを指定します。デフォルトオプションです。
      "m" と "s" を同時に指定した状態と同一です。
      つまり、

      print mb_ereg_replace('^.bc.$', "--", "abc\n", "s"); // 結果 abc\n 

      print mb_ereg_replace('^.bc.$', "--", "abc\n", "m"); // 結果 abc\n 

      print mb_ereg_replace('^.bc.$', "--", "abc\n", "p"); // 結果 -- 


"e" - 置換する文字列を有効な php のステートメントとみなし、評価して、
      その結果と置き換えます。

      // 結果 27
      print mb_ereg_replace('(.*).(.*)', "\\1\\2\\3", "24+3", "e");

知られているバグ:

  $ echo '<?php
    print mb_ereg_replace("\$", "--", "abc\ndef\n", "");
    ?>' | php

    結果: 
      abc----
      def----

  $ ruby -e 'print "abc\ndef\n".gsub(/$/, "--");'

    結果: 
      abc--
      def--

  $ perl -e '$_ = "abc\ndef\n"; $_ =~ s/$/--/mg; print $_;'

    結果: 
      abc--
      def--
      --

  この3つの挙動は異りますので注意してください。
  これはバグでしょうか?

===========================================================================

以上、間違いがありましたらぜひ指摘してください。
 

> 
> ところで、
>   mb_ereg_search_init
>   http://www.php.net/manual/ja/function.mb-ereg-search-init.php
> と、どう違うんだろう・・・?


mb_ereg_search_init() は mb_ereg_search() や mb_ereg_search_getregs()
との合わせ技に使います。

一方、mb_regex_set_options() は、mb_ereg() など、オプション指定ができない
関数に対しオプションを指定する際に利用します。

--
Moriyoshi