Reperage d'informations personnelles avec regexp

Contenu du snippet

Ces regexp ont ete developpees pour une recherche d'informations personnelles dans un cv donc beaucoup de mise en forme differentes a gerer.
Vous y trouverez des regpex pour :
nom, prenom
civilite
adresse
code postal
ville
email
numero de telephone (fixe et portable)
age
experiences professionnelles (poste et societe)
formation (diplome, etablissement)
langues (a ameliorer)
divers
Apres plusieurs affinages voila le resultat, si vous avez des commentaires/conseils constructifs j'en serais ravi.

Source / Exemple :


<?php
echo '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">';

//pratique pour les regexp
function accent($chaine)
{
   $accent  ="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ";
   $noaccent="aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby";
   return strtr(trim($chaine),$accent,$noaccent);
} 

if(isset($_FILES["fichier"]["name"])) {

        //cette partie doit etre grandement amelioree niveau securite

	if(empty($_FILES["fichier"]["name"])) echo "Veuillez indiquer le chemin du fichier";

	$dir="Upload\\";
	$fichier=$dir . basename($_FILES["fichier"]["name"]);
	$tmp=$_FILES["fichier"]["tmp_name"];
	$size=$_FILES["fichier"]["size"];
	
	if(!is_uploaded_file($tmp)) { echo " fichier absent"; };
	if(!move_uploaded_file($tmp, $fichier)) { echo " pb deplacement "; };

	echo "$fichier <br>";
	echo "$size <br>";

	$com = 'antiword -t "'.$fichier.'" > temp.txt';
	echo "$com <br>";
	
	if(exec($com)) echo "conversion reussie"; 

	if($handle = fopen("temp.txt", "rb")) {
	echo "ouverture reussie <br>";
	}
	
        //pre-affichage

	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		$buffer = preg_replace(array('#[|]#s','#^-#','#^?#','#^[(]#','#^[ ]#'), '', trim($buffer));
		$buffer = preg_replace('#([ ][ ]+)#s', ' ', trim($buffer));
		$buffer = accent($buffer);
		echo "ligne : $buffer<br>";
	}
   fclose($handle);
   
   if(false !== ($handle = fopen('temp.txt', 'rb'))) {
	echo "ouverture reussie <br>";
	}
		
	$j=0;
	$c=0;
	$d=0;
	$k=0;
	$z=0;
	$f=0;
	$societe="";
	$prenom="";
	$nom="";
	$adresse="";
	$ville="";
	$cp="";
	$divers="";
	$taille=0;
	$age=0;
	$l=false;
	$testVille=false;
	$testNom=false;
	$testCiv=false;
	$testEmail=false;
	$testAdresse=false;
	$testFixe=false;
	$testPort=false;
	$testCp=false;
	$testAge=false;
	$testExp=false;
	$testForm=false;
		
	while (feof($handle)===false) {
		if($testForm==true && $testExp==false && $z<=250){
		$z++;
		}else{
		$buffer = fgets($handle, 4096);
                //on vire les saloperies de debut de ligne
		$buffer = preg_replace(array('#[|]#s','#^-#','#^?#','#^[(]#','#^[ ]#'), '', trim($buffer));
                //on remplace les espaces mutliples
		$buffer = preg_replace('#([ ][ ]+)#s', ' ', trim($buffer));
		$buffer = accent($buffer);
		}
		
                //Si vous avez du mal a voir a quoi sert la regexp, regardez le nom du booleen

		if(preg_match('#(M(onsieur|adame|mademoiselle|r|d|lle))#',$buffer,$out) !==0 && $testCiv===false) { 
			$civilite = $out[0];
			print_r($out);
			echo "<br>";
			echo $buffer = str_replace($civilite, '', $buffer); 
			echo "<br>civilite : $civilite<br>";
			$testCiv=true;
			echo"je suis passe dans la boucle civilite<br>";
		}
			
		if(preg_match('#[A-Z]:alpha:+(?:\s)?[-?]?(?:\s)?([A-Z]:alpha:+)?(?:\s)?([A-Z]:alpha:+)?(?:\s)?[-?]?(?:\s)?[A-Z]:alpha:+\s*#',$buffer,$out) !==0 && $testNom===false) {
			$res = preg_split('# #', $buffer, -1, PREG_SPLIT_NO_EMPTY);
			$testNom=true;
			switch (count($res)) {
				case (2) : $prenom = $res[0]; $nom = $res[1];
					break;
					
				case (3) : $prenom = $res[0]; $nom = $res[1].' '.$res[2];
					break;
					
				case (4) : 
					if ( $res[1]=="-" || $res[1]=="?") { 
						$prenom = $res[0].' '.$res[1].' '.$res[2];
						$nom = $res[3];
						break; }
					if ( $res[2]=="-" || $res[2]=="?") {
						$prenom = $res[0];
						$nom = $res[1].' '.$res[2].' '.$res[3]; 
						break; 
						}else{
							$prenom = $res[0];
							$nom = $res[1].' '.$res[2].' '.$res[3];
							break;
						}
							
				case (5) :
					if ($res[1]=="-" || $res[1]=="?") {
						$prenom = $res[0].' '.$res[1].' '.$res[2];
						$nom = $res[3].' '.$res[4];
						break;
						}
					if ( $res[3]=="-" || $res[3]=="?") {
						$prenom = $res[0];
						$nom = $res[1].' '.$res[2].' '.$res[3].' '.$res[4];
						break;
						}
							
					case (6) :
						$prenom = $res[0].' '.$res[1].' '.$res[2];
						$nom = $res[3].' '.$res[4].' '.$res[5];
						break;
			}
			echo "nom : $nom<br>";
			echo "prenom : $prenom<br>";
		}
			
		if(preg_match('#([0-9]{1,3})[, ]?(?:[a-zA-Z]{1,3})?[, ]?(rue|avenue|boulevard|impasse|cours)(?:,)?(?:\s)?([-?\'0-9[:alpha:]](?:\s)?)+\s*#i', $buffer, $out) !==0 && $testAdresse===false) {
			$adresse = $out[0];
			echo "adresse : $adresse<br>";
			$testAdresse=true;
		}
			
		if(preg_match('#(([0-9](?:\s)?){5})\s([-?[:alpha:]](?:\s)?)+\s*#', $buffer, $out) !==0 && $testCp===false) {
			$res = preg_split('# #', $buffer, -1, PREG_SPLIT_NO_EMPTY);
			$testCp=true;
			$pm = sizeof($res);
			for ($i=0; $i<=sizeof($res)-1; $i++) {
				if (preg_match('#[0-9]{2}|[0-9]{3}#', $res[$i], $out) !==0 && $j<=2) {
					$cp .= $res[$i];
					if(preg_match('#[0-9]{5}#', $cp, $out)) {
						$j=3;
					}
				$j++;
				}
				
				if (preg_match('#((:alpha:(?:\s)?)[-?]?(?:\s)?)+#', $res[$i], $out) !==0 && $testVille===false) {
					$ville .= $out[0].' ';
				}
			}
			echo "ville : $ville<br>";
			echo "cp : $cp<br>";
		}
		
		if(preg_match('#[a-z0-9]([-_.]?[a-z0-9])+@[a-z0-9]([-_.]?[a-z0-9])+\.[a-z]{2,5}$#ixm', $buffer, $out) !==0 && $testEmail===false) {
			$email = $out[0];
			echo " email : $email<br>";
			$testEmail = true;
		}
			
		if(preg_match('#[0][1234589][- \.?]?([0-9][0-9][- \.?]?){4}#', $buffer, $out) !==0 && $testFixe===false) {
			$telFixe = $out[0];
			echo "fix : $telFixe<br>";
			$buffer = str_replace($telFixe, '', trim($buffer));
			$testFixe=true;
		}
			
		if(preg_match('#[0][6][- \.?]?([0-9][0-9][- \.?]?){4}#', $buffer, $out) !==0 && $testPort===false) {
			$telPort = $out[0];
			echo "portable : $telPort<br>";
			$buffer = str_replace($telPort, '', trim($buffer));
			$testPort=true;
		}
			
		if(preg_match('#(^(age :[ ]*))?(^([0-9]{2}))[ ][a][n][s][ ]*#i',$buffer, $out) !==0 && $testAge===false) {
			if(preg_match('#exp(é|e)rience#', $buffer, $out)){
				}else{
			echo "bufAge : $buffer<br>";
			print_r($out);
			$testAge=true;
			$res = preg_split('# #', $buffer, -1, PREG_SPLIT_NO_EMPTY);
			$age = date('Y') - $res[0];
			echo "<br>age : $age<br>";
				}
			
		}
		
		if(preg_match('#((Né)[e]?)?[ ](le|:|en)?[ ]([0-2][0-9]|[3][0-1]|[0-9])[-?/ ]([0][1-9]|[1][0-2])?(:alpha:+)?[-?/ ]([0-9]{2,4})#ixm', $buffer, $out) !==0 && $testAge===false) {
			$buffer = strtolower($buffer);
			$buffer = accent($buffer);
			$testAge=true;
			$taille=sizeof($out);
			$pos = 3;
			for ($i=0; $i<=$taille-1; $i++) {
				if(preg_match('#:alpha:#i', $out[$i], $res)) {
					$out[$i] = strtolower($out[$i]);
					$out[$i] = accent($out[$i]);
                                        //un preg_replace a venir
					switch($out[$i]) {
						case('janvier') : { $out = str_replace($out[$i], '01', $out);$pos = 2;break; }
						case('fevrier') : { $out = str_replace($out[$i], '02', $out);/*echo "<br>apres : ";print_r($out);echo"<br>"*/;$pos = 2;break; }
						case('mars') : { $out = str_replace($out[$i], '03', $out);$pos = 2;break; }
						case('avril') : { $out = str_replace($out[$i], '04', $out);$pos = 2;break; }
						case('mai') : { $out = str_replace($out[$i], '05', $out);$pos = 2;break; }
						case('juin') : { $out = str_replace($out[$i], '06', $out);$pos = 2;break; }
						case('juillet') : { $out = str_replace($out[$i], '07', $out);$pos = 2;break; }
						case('aout') : { $out = str_replace($out[$i], '08', $out);$pos = 2;break; }
						case('septembre') : { $out = str_replace($out[$i], '09', $out);$pos = 2;break; }
						case('octobre') : { $out = str_replace($out[$i], '10', $out);$pos = 2;break; }
						case('novembre') : { $out = str_replace($out[$i], '11', $out);$pos = 2;break; }
						case('decembre') : { $out = str_replace($out[$i], '12', $out);$pos = 2;break; }
					}
				}
			}
						
			if(preg_match('#\b[0-9]\b#', $out[$taille-4], $res)) $out[$taille-4] = '0'.$out[$taille-4];
			
			if(preg_match('#([0-9]{4})#',$out[$taille-1], $res)) {
				$age = $out[$taille-1].'-'.$out[$taille-$pos].'-'.$out[$taille-4];
				$buffer = str_replace($out,'',trim($buffer));
					}else{
						if(preg_match('#([0-9]{2})#',$out[$taille-1], $res)) {
						$age = '19'.$out[$taille-1].'-'.$out[$taille-$pos].'-'.$out[$taille-4];
						$buffer = str_replace($out,'',trim($buffer));
						}
					}
				echo "age : $age<br>";
		}
		
		$buffer = accent($buffer);
		
		if(preg_match('#((experience[s]?|parcours)[ ](professionnel(le)?[s]?))#i', $buffer, $out) && $testExp==false ) {
			while(preg_match('#^([ ]*[F](ormation|ORMATION))|([L](angues|ANGUES))|^([D](ivers|IVERS))\b|([L](oisirs|OISIRS))|([D](iplome|IPLOME)[sS]?)#', $buffer, $out) == 0 ) {
				$buffer = fgets($handle, 4096);
				$buffer = preg_replace(array('#[|]#s','#^-#','#^?#','#^[(]#','#^[ ]#'), '', trim($buffer));
				$buffer = preg_replace('#([ ][ ]+)#s', ' ', trim($buffer));
				$buffer = accent($buffer);
					
				if(feof($handle)) break; // quand je met ca dans le while ca ne marche jamais -> ???
					
				if(preg_match('#(([0-2][0-9]|[3][0-1]|[0-9])?[-?/]?([0][1-9]|[1][0-2])?(:alpha:+)?[-?/]?([1-2]([9]|[0])[0-9]{2})|(([0-2][0-9]|[3][0-1]|[0-9])?[-?/]?([0][1-9]|[1][0-2])[-?/]?([0-9]{2})))#ixm', $buffer, $out) !==0 && $c<=2) {
				
					$testExp=true;
					$c++;
					$xdeb = preg_replace('#/aà?#', '-', trim($out[0]));
					$buffer = str_replace($out[0], '', trim($buffer));
															
					if(preg_match('#(([0-2][0-9]|[3][0-1]|[0-9])?[-?/ ]?([0][1-9]|[1][0-2])?(:alpha:+)?[-?aà/ ]?([1-2]([9]|[0])[0-9]{2})|(([0-2][0-9]|[3][0-1]|[0-9])?[-?/]?([0][1-9]|[1][0-2])[-?/]?([0-9]{2})))#ixm', $buffer, $out) !==0 ) {
						
						$xfin = preg_replace('#(a|à)#', '', trim($out[0]));
						$xfin = preg_replace('#/aà?#', '-', trim($out[0]));
						$buffer = str_replace(trim($out[0]), '', trim($buffer));
						}else{
							if(preg_match('#((a|à)(\s)(ce)(\s)(jour))|(depuis)#i', $buffer, $out) || $c==1) {
								$xfin = Date('m').'-'.Date('Y');
								if(isset($out[0])) 
									$buffer = str_replace($out[0], '', trim($buffer));
									}else{
										$xfin=$exp[$c-1][1];
									}
						}
						$xfin=preg_replace('#^[-?.a:]#', '', $xfin);
						$exp[$c][1]=$xdeb;
						$exp[$c][2]=$xfin;
						
						while(preg_match('#([0-2][0-9]|[3][0-1]|[0-9])?[-?/ ]?([0][1-9]|[1][0-2])?(:alpha:+)?[-?aà/ ]?([1-2]([9]|[0])[0-9]{2})#ixm', $buffer, $out) == 0 && $k<=2 && $l===false ) {
							if(preg_match('#[A-Z]([[:alpha:]\']+[ ]?)+#i', $buffer, $out) !==0) {
								$poste[$k] = $out[0];
								$buffer = str_replace($out[0], '', trim($buffer));
								$k++;
								
							}
							
							if(preg_match('#[A-Z](:alpha:*[.\']?[ ]?[:]?[ ]?:alpha:+[.\']?[ ]?)+#', $buffer, $out) !==0) {
								$societe[$k] = $out[0];
								$buffer = str_replace($out[0], '', trim($buffer));
								$l=true;
							}else $l=true;
						}
						$l=false;
						
				}
			}
			if(isset($poste)){
			echo"<br>postes : ";
			print_r($poste);
			}
			if(isset($societe)){
			echo"<br>societe : ";
			print_r($societe);
			}
			if(isset($exp)){
			echo"<br>dates : ";
			print_r($exp);
			echo"<br>";
			}
		}
			
			$k=0;
			$l=false;
			
		if(preg_match('#(^[ ]?[F](ormation|ORMATION))|(^[D](iplome)[s]?|IPLOME[S]?)#', $buffer, $out) || preg_match('#DIPLOME#', $buffer, $out) && $testForm==false) {
			while((preg_match('#(langue[s]?)|((expérience[s]?|parcours)[ ](professionnel(le)?[s]?))|\b(divers)\b|(loisirs)|(informatique)|((langue)[s]?)#i', $buffer, $out) == 0) ) {
				
				if(feof($handle)) break;
				
				$buffer = fgets($handle, 4096);
				$buffer = preg_replace(array('#[|]#s','#^-#','#^?#','#^[(]#','#^[ ]#'), '', trim($buffer));
				$buffer = preg_replace('#([ ][ ]+)#s', ' ', trim($buffer));
				$buffer = accent($buffer);
								
				if(preg_match('#(([0-2][0-9]|[3][0-1]|[0-9])[-?/])?([0][1-9]|[1][0-2])?(:alpha:+)?[-?/a]?([1-2]([9]|[0])[0-9]{2})#ixm', $buffer, $out) !==0 && $d<=2) {
					$testForm=true;
					$d++;
					$fdeb = preg_replace('#/aà?#', '-', trim($out[0]));
					$buffer = str_replace($out[0], '', trim($buffer));
										
					if(preg_match('#([0-2][0-9]|[3][0-1]|[0-9])?[-?/ ]?([0][1-9]|[1][0-2])?(:alpha:+)?[-?aà/ ]?[1-2]([9]|[0])[0-9]{2}#ixm', $buffer, $out) !==0 ) {
						$ffin = preg_replace('#(a|à)#', '', trim($out[0]));
						$ffin = preg_replace('#/aà?#', '-', trim($out[0]));
						$buffer = preg_replace('#^[ ](a|à)[ ]#', '', $buffer);
						$buffer = str_replace(trim($out[0]), '', trim($buffer));
						}else{
							if(isset($out[0])) $buffer = str_replace($out[0], '', trim($buffer));
						}
							
					if(isset($ffin)) $ffin=preg_replace('#^[-?.a:]#', '', $ffin);
						$form[$d][1]=$fdeb;
						
						if(isset($ffin)) $form[$d][2]=$ffin;
						
						$fdeb="";
						unset($ffin);
							while(preg_match('#([0-2][0-9]|[3][0-1]|[0-9])?[-?/ ]?([0][1-9]|[1][0-2])?(:alpha:+)?[-?aà/ ]?([1-2]([9]|[0])[0-9]{2})#ixm', $buffer, $out) == 0 && $k<=2 && $l===false ) {
								if(preg_match('#([A-Z][.]?[[:alpha:]\']+[.]?[ ]?[:]?[ ]?[[:alpha:]\']+[.]?[ ]?)+#i', $buffer, $out) !==0) {
									$dipl[$k] = $out[0];
									$buffer = str_replace($out[0], '', trim($buffer));
									$k++;
								}
								if(preg_match('#[A-Z](:alpha:*[.\']?[ ]?[:]?[ ]?:alpha:+[.\']?[ ]?)+#', $buffer, $out) !==0) {
									$etab[$k] = $out[0];
									$buffer = str_replace($out[0], '', trim($buffer));
									$l=true;
									}else break;
							}
						$l=false;
				}
		}
		if(isset($dipl)) {
		echo"<br>diplomes : ";
		print_r($dipl);
		}else echo "<br>no diplomes found<br>";
		
		if(isset($etab)) {
		echo"<br>Etablissements : ";
		print_r($etab);
		}else echo "<br>no etablissement found<br>";
				
		if(isset($form)) {
		echo"<br>dates : ";
		print_r($form);
		}else echo "<br>no dates diplomes found<br>";
		}
		
		if(preg_match('#anglais|allemand|italien|espagnol|portugais|arabe|chinois#i', $buffer, $out)) { 
			$f++;
			$langue[$f]=$buffer;
			}
		
		if(preg_match('#([D](ivers|IVERS))\b#', $buffer, $out)) {
			while(preg_match('#.+#', $buffer, $out)==true){
				if(feof($handle)) break;
				$divers.="$buffer<br>";
				$buffer = fgets($handle, 4096);
			}
		}
	}
	if(isset($langue)){
		echo"langues : ";
		print_r($langue);
		echo"<br>";
	}
	
	if(isset($divers)) echo "<br>$divers";
	
	fclose($handle);
}

?>
<html>
<head><title>Formulaire CV
</title></head>

<body>
<br>

<form method="POST" action="test.php" name="formulaire" enctype="multipart/form-data"> 
<br>

<div class="block">
<h2><span>Envoyez votre CV</span></h2>
	<div class="box">
		<table>
		<tr><td>
<input type="file" name="fichier"> <br>
<input type="submit" name="valider"> <br>
		<tr><td>
		</table>
	</div>
</div>
</form>
</body></html>

Conclusion :


J'ai galere avec l'age et l'adresse mais c'est regle, ce sont les experiences et la formation qui ont ete les plus dures =)
Pour ceux que ca interesse le logiciel gratuit "antiword" pour la conversion de document word est porte sous windows, comme vous pouvez le voir il fonctionne en ligne de commande donc parfait a utiliser dans une page php.
Toute remarque sur la structure et la proprete du code est egalement bienvenue, plus particulierement la securite dans laquelle je n'y connais rien. Juste je vais mettre en place un systeme pour ne pas accepter des fichiers trop volumineux.
Voila j'espere en aider certains et recevoir des conseils.
++

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.