4

バージョン 5.3.4 - 5.5.0beta1 では\w\pL同等ですか?

 <?php
preg_match_all('#\w#u','سیب',$f);
var_dump($f);

preg_match_all('#\pL#u','سیب',$f);
var_dump($f);

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(2) "س"
    [1]=>
    string(2) "ی"
    [2]=>
    string(2) "ب"
  }
}
array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(2) "س"
    [1]=>
    string(2) "ی"
    [2]=>
    string(2) "ب"
  }
}

オンライン PHP シェルで上記のスニペットを試してください。

4

1 に答える 1

8

uPCRE 正規表現で修飾子を使用すると、PHP はPCRE_UCPフラグに加えてフラグも設定し、デフォルトの ASCII 文字だけでなく、他の POSIX 文字クラスにPCRE_UTF8Unicode プロパティが導入されるようになります。\wPCREのマニュアルページから:

PCRE_UCP

このオプションは、PCRE が \B、\b、\D、\d、\S、\s、\W、\w、および一部の POSIX 文字クラスを処理する方法を変更します。デフォルトでは、ASCII 文字のみが認識されますが、PCRE_UCP が設定されている場合は、代わりに Unicode プロパティを使用して文字を分類します。

これは、PHP ソース コード(366 ~ 372 行目) で確認できます。

        case 'u':   coptions |= PCRE_UTF8;
/* In  PCRE,  by  default, \d, \D, \s, \S, \w, and \W recognize only ASCII
   characters, even in UTF-8 mode. However, this can be changed by setting
   the PCRE_UCP option. */
#ifdef PCRE_UCP
                    coptions |= PCRE_UCP;
#endif

PCRE_UCPしたがって、上でリンクしたのと同じ man ページから、が設定されている場合、文字クラスが次のようになることがわかります。

\d \p{Nd} に一致する任意の文字 (10 進数)

\s \p{Z} に一致する任意の文字に、HT、LF、FF、CR を加えたもの

\w \p{L} または \p{N} に一致する任意の文字とアンダースコア

于 2013-03-29T03:30:50.613 に答える