0

これは私のパターンです:

$fullname = '/^([a-zA-Z]+)(?:[,]?[\s]?)?([a-zA-Z]+)((?:\s)([a-zA-Z]{1}))?$/i';

preg_match($nameReg, $value, $match)PHPで使用しています。

姓、名の順にキャプチャしたい。私は ajax を使用して SQL ステートメントで LIKE を使用してオンザフライで結果をロードするので、名前を待つのではなく、姓から始めたいと考えています。

問題は、姓 (最初の単語) のみを入力すると、姓の最後の文字がキャプチャされたグループとして取得されることです。

Array
(
    [0] => SMITH
    [1] => SMIT
    [2] => H
)

手に入れたい

Array
(
    [0] => SMITH
    [1] => SMITH
)

しかし、ここで何が起こっているのかわかりません。

4

1 に答える 1

2

これは、2 番目の に少なくとも 1 つの文字が必要なためです[a-zA-Z]+。その 2 番目のキャプチャ グループをオプションにすると、動作するはずです。

/^([a-zA-Z]+)(?:[,]?[\s]?)?([a-zA-Z]+)?((?:\s)([a-zA-Z]{1}))?$/i

ただし、大文字と小文字を区別しないフラグを使用していますが、大文字と小文字の両方のバリアントを提供しています。Plus{1}は常に冗長です。最後に、1 文字の文字クラスも不要です。好みの問題かもしれませんが、エスケープする必要があるスペースや文字の読みやすさを向上させるだけだと思います。これは短縮できます:

/^([a-z]+)(?:,?\s?)?([a-z]+)?((?:\s)([a-z]))?$/i

オプションのグループをいくつか入れ子にするのも良い考えかもしれません。たとえば、カンマやスペースで区切られていない場合、2 番目の名前を許可する理由はありません。

/^([a-z]+)(?:(?:,\s?|\s)([a-z]+)?)?(?:\s([a-z]))?$/i
于 2012-11-08T16:58:45.767 に答える