2017-05-16 1 views
2

J'ai besoin d'aide pour modifier l'expression rationnelle qui est utilisée comme modèle dans preg_match pour prendre en compte les deux types de chaînes, une avec le nom de famille et une sans le nom de famille.Comment comptabiliser deux types de chaînes différents lors de l'utilisation de preg_match?

$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); 

retourne un tableau de:

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

Mais si la chaîne est (manque le nom de famille):

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

Il retourne un tableau de:

array(
    'fname' => '', 
    'lname' => '', 
    'gender' => 'M', 
    'dob' => '', 
) 
Utiliser un groupe optionnel de non-capture autour de

Répondre

2

motif \h+(?<lname>[\p{L}\h-]+?):

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

Voir la regex demo

Le (?:...)? est un groupe non-capture qui a une ? quantificateur qui lui est appliquée, elle rend la séquence de motifs à l'intérieur correspondent à 1 ou 0 fois, à savoir les marques les options en tant que séquence.