2017-08-22 20 views
2

私はその後、必要に応じてその他のミドルネームまたはイニシャルをフィールドに名前が含まれているかどうか、少なくとも最初/最後の名前から成る、真/偽チェックするために、このPHPの正規表現を使用して、としています。するpreg_match最初/最後の名前に一致するグループ

$success = preg_match("/([\x{00c0}-\x{01ff}a-zA-Z'-]){2,}(\s([\x{00c0}-\x{01ff}a-zA-Z'-]{1,})*)?\s([\x{00c0}-\x{01ff}a-zA-Z'-]{2,})/ui",$user['name'],$matches); 

$output[($success ? 'hits' : 'misses')][] = ['id' => $user['id'],'email' => $user['email'],'name' => $user['name'],'matches' => $matches]; 

一致/不一致のヒット/ミス、すなわち真/偽の点で問題なく動作するようです。

"name": "Jonny Nott", 
    "matches": [ 
    "Jonny Nott", 
    "y", 
    "", 
    "", 
    "Nott" 
    ] 

    "name": "Name Here", 
    "matches": [ 
    "Name Here", 
    "e", 
    "", 
    "", 
    "Here" 
    ] 

    "matches": [ 
    "Jonathan M Notty", 
    "n", 
    " M", 
    "M", 
    "Notty" 
    ] 

しかし、その後、私は私が権利を取得するために苦労してるグループを使用して、姓と名を抽出するために同じものを使用しようとしている。..

のような結果の多くを取得します私が本当に欲しいもの..but

は常にちょうど最初の名前が含まれており、常にちょうど最後の名前を格納するための1にする「マッチ」の一つです。

間違って何にとして任意のポインタ?

答えて

1

正規表現でcapturing groupを定義するたびに、それが一致する文字列の一部は、結果の配列に別個の項目として追加されます。 - non-capturing

  • 電源を入れキャプチャグループ((\s+\w+)+ =>

    • パターンを最適化し、((a)+ =>a+単一原子の周りなどのグループを)冗長グループを取り除く:それらを取り除くには、2つの方法がありますあなたが任意の文字に一致する\p{L} Unicodeプロパティクラスで一部に一致する文字を置き換える場合(?:\s+\w+)+

    また、あなたのケースでは、あなたがパタパタを向上させることができます。

    使用

    /[\p{L}'-]{2,}(?:\s[\p{L}'-]+)?\s[\p{L}'-]{2,}/u 
    

    ここregex demo

    を参照してください、それが1または0回にマッチ落札後、唯一の1つのグループは(?:...)、左、それはオプションで、?されます。

    詳細

    • [\p{L}'-]{2,}から2以上の文字、'又は-
    • (?:\s[\p{L}'-]+)? - 空白の1または0の出現後、1つの以上の文字、'又は-
    • \s - 空白
    • [\p{L}'-]{2,} - 2文字以上、'または-
  • 1

    試してみてください。

    (?P<firstName>[\x{00c0}-\x{01ff}a-zA-Z'-]{2,})(\s([\x{00c0}-\x{01ff}a-zA-Z'-]{1,})*)?\s(?P<lastName>[\x{00c0}-\x{01ff}a-zA-Z'-]{2,}) 
    

    あなたが最初のグループ{2、}繰り返したている主な間違い - あなたは括弧を使用する必要がありますが、そうでない時はいつでもない最初の範囲

    1

    使用非キャプチャグループ(?:...)をその部分を一致させたい(スペースやミドルネームの例えば一部)とグループをキャプチャにおける数量詞が含まれ、一致する文字だけではなく、(最初の名前{2,}用などがグループを取り込むにする必要があります)。

    ([\x{00c0}-\x{01ff}a-zA-Z'-]{2,})(?:\s(?:[\x{00c0}-\x{01ff}a-zA-Z'-]{1,})*)?\s([\x{00c0}-\x{01ff}a-zA-Z'-]{2,}) 
    
    関連する問題