php
  • regex
  • preg-match
  • nsregularexpression
  • 2017-05-16 3 views 2 likes 
    2

    preg_matchのパターンとして使用されている正規表現を修正して、両方のタイプの文字列、姓と姓、姓を持たない文字列を考慮する必要があります。preg_matchを使用する場合、2つの異なるタイプの文字列を考慮する方法は?

    $string = "Tim Johnson (M) - 12/19/2001 (14 years)"; 
    
    $re = '~^(?<fname>[\p{L}-]+)\h+(?<lname>[\p{L}\h-]+?)\h+\((?<gender>[MF])\)[-\h]+(?<dob>[\d/]+)~mu'; 
    
    preg_match($re, $string, $matches); 
    

    はの配列を返します:

    array(
        'fname' => 'Tim', 
        'lname' => 'Johnson', 
        'gender' => 'M', 
        'dob' => '12/29/2001', 
    ) 
    

    をしかし、文字列は(姓を逃す)の場合:

    array(
        'fname' => '', 
        'lname' => '', 
        'gender' => 'M', 
        'dob' => '', 
    ) 
    

    $string = "Tim (M) - 12/19/2001 (14 years)"; 
    

    それはの配列を返します

    答えて

    2

    オプションの非キャプチャグループを使用します。 \h+(?<lname>[\p{L}\h-]+?)パターン:

    ^(?<fname>[\p{L}-]+)(?:\h+(?<lname>[\p{L}\h-]+?))?\h+\((?<gender>[MF])\)[-\h]+(?<dob>[\d/]+) 
            ^^^       ^^ 
    

    、すなわちなり、regex demo

    (?:...)?が適用?数量詞を有する非捕捉基であり、それはその内部パターンの配列が1又は0回に一致させる見ますそれらは任意のを配列番号として指定します。

    関連する問題