1

私は正規表現が得意ではありませんが、誰かが私にもっとよく説明してくれることを願って、デバッグしたコードでこれを見つけました。なぜ私はいつもこのシナリオで間違っていたのだろうか.

\p{L}カテゴリ「文字」の単一のコードポイントに一致することはわかっています。0-9数値です。

$regExp = /^\s*
     (?P([0-2]?[1-9]|[12]0|3[01]))\s+
     (?P\p{L}+?)\s+
     (?P[12]\d{3})\s*$/i;

    $value = '12 Février 2015' ;
    $matches = array();

    $match = preg_match($regExp, $value, $matches);

追加情報、私はこれを思いつきました:

$match = preg_match("/^\s*(?P<monthDay>([0-2]?[1-9]|[12]0|3[01]))\s+(?P<monthNameFull>\p{L}+?)\s+(?P<yearFull>[12]\d{3})\s*$/i", "18 Février 2015");
var_dump($match); //It will print int(0).

しかし、値が の場合、18 February 2015int(1) が出力されます。どうしてこんなことに?\p{L}Unicode 文字を受け入れるため、両方の値で 1 を返すと想定されています。

4

4 に答える 4

0

/i の代わりに /u を使用してください。

$match = preg_match("/^\s*(?P<monthDay>([0-2]?[1-9]|[12]0|3[01]))\s+(?P<monthNameFull>\p{L}+?)\s+(?P<yearFull>[12]\d{3})\s*$/u", "18 Février 2015");
var_dump($match); //It will print int(1).

助けてくれてありがとう

于 2014-09-05T10:55:48.730 に答える
0

uUnicode の修飾子を使用します。

$regExp = /^\s*
   (?P<monthDay>([0-2]?[1-9]|[12]0|3[01]))\s+
   (?P<monthNameFull>\p{L}+?)\s+
   (?P<yearFull>[12]\d{3})\s*$/u;
//                      here __^

i修飾子は必須ではなく、大文字\p{L}と小文字が区別されません。

于 2014-09-05T09:59:17.827 に答える