OVH Cloud OVH Cloud

regex time ! iiiiiaaahhh !

4 réponses
Avatar
borntoride
Salut à tous !

Quelqu'un connait un bout de code regex pour retourne et/ou valider un
prix. Voici les formats que j'obtiens des utilisateurs.... c'est
presque infini.

123 000 $
123.000 $
123.000.00
123000
$123 000,00
123 $ / mois
123 / mois
120 000 nego
....
etc

pour ressortir en format 123 000 $

Quelqu'un connait déjà la recette miracle ?

Merci milles fois !

4 réponses

Avatar
borntoride
Réponse à moi-même ... j'ai réussi à scripter tun petit script
magique qui fait le tout... si ca peut servir un jour à quelqu'un pour
ne pas à avoir à le refaire. Je le post ici même (attention aux
millions de commentaires).

Si jamais quelqu'un voit comment le pourrais l'améliorer ne vous
gênez pas !

<?php
function testPrix($lePrix) {
//Tableau de parcours du début
$beforeArray = "";
//Apres avoir épurer le tableau on met la donnée ici
$tempPrix = "";
$tempInvPrix = "";

//on crée un tableau avec un charactère par ligne pour pouvoir
le parcourir ensuite
// avec foreach
$beforeArray = str_split($lePrix);

//on boucle dans le tableau pour extraire les chiffres, points et
virgules
foreach ($beforeArray as $caract) {
// On crée une var qui prend la valeur ascii du caractere
parcouru dans le tableau
$caractAsc = ord($caract);

//Les chiffres se situent de 48 à 57 et le point virgule
correspondent a 46 et 48 en ascii
if ((($caractAsc >= 48) AND ($caractAsc <= 57)) OR ($caractAsc
== 46) OR ($caractAsc == 44)) {
//on met la var dans le tempPrix pour batir le prix
$tempPrix .= $caract;
}

//echo "$caract : $caractAsc<br>";
}

//DEL echo "Prix apres les strips : $tempPrix <br>";

//fait une copie renverser
$tempInvPrix = strrev($tempPrix);

// vérifie si le 3ième caract équivaut à . ou , => ca veut
dire qu'on strip les trois premiers caract
// dans ce cas la
if (($tempInvPrix[2] == ",") OR ($tempInvPrix[2] == ".")) {
$tempPrix = strrev(substr($tempInvPrix, 3,
strlen($tempInvPrix)-3));
}



//DEL echo "Le prix avant le format sans stip ., : $tempPrix<br>";

//avant de faire l'output en format_number, faut enlever les . et
les ,
//car sinon 1.000.000 donne 1 !!
$afterArray = str_split($tempPrix);

//remet à 0 le tempPrix pour pouvoir le réemplir
$tempPrix = "";

foreach($afterArray as $caract) {

// sort le #1 ascii des caract
$caractAsc = ord($caract);
//DEL echo"passer dans la bouche<br>";
//envele les , et les .
if (!(($caractAsc == 46) OR ($caractAsc == 44))) {
//on met la var dans le tempPrix pour rebatir le prix
$tempPrix .= $caract;
//DEL echo "TempPrix $tempPrix => $caract<br>";
//DEL echo"reallyinside<br>";
}
}

//DEL echo "Le prix avant le format avec strip ., :
$tempPrix<br>";

//on met un standart d'output
// seulement si la var est pas vide sinon ca retourne un gros 0 et
ca gache le reste
if (!(empty($tempprix))) {
$tempPrix = number_format($tempPrix, 0, ',', ' ');
}

// si la var n'est pas vide à ce point on ajoute un $
if (!(empty($tempPrix))) {
$tempPrix = $tempPrix." $";
}

//on boucle dans le tableau pour extraire les infos texte
foreach ($beforeArray as $caract) {
// On crée une var qui prend la valeur ascii du caractere
parcouru dans le tableau
$caractAsc = ord($caract);

//Les chiffres se situent de 48 à 57 et le point virgule
correspondent a 46 et 48 en ascii + le $ = 36
if (!((($caractAsc >= 48) AND ($caractAsc <= 57)) OR ($caractAsc
== 46) OR ($caractAsc == 44) OR ($caractAsc == 36))) {
//on met la var dans le tempPrix pour batir le prix
$tempTxt .= $caract;
}
}

// on trim la var txt
$tempTxt = trim($tempTxt);

echo " $lePrix : $tempPrix $tempTxt<br><br>";
}



$tableauTest = array ( "123.000.10",
"123 000 $",
"1.000.000.00 $ / par mois",
"$675 / mois",
"670.00 par mois",
"670 000 nego",
"négotiable 170.000.00",
"$132,312,32",
"à discuter",
"plus ou moins 5000.32 $",
"550 000$",
"860.00$/ mois",
"292 000.00",
"1400 par mois",
"139 900$",
"239000$",
"250000",
"$184,000.00",
"162 000.00",
"224,000.",
"199,000.$",
"69,900",
"229,000.00",
"1,300.00",
"72500.00",
"129,900.000",
"139.900.00",
"145 000 nego.",
"$285,000",
"173000.00",
"33000",
"2,200,000",
"670$ par mois",
"89,000.00",
"$289,900.00");


foreach ($tableauTest as $var) {
testPrix($var);
}

?>
Avatar
Redy
Et pourquoi pas non plus "Cent vingt trois mille"...
Conseil, modifies ton formulaire afin que les gens puissent séparer le
code la monnaie "USD, $, etc...) du montant.
Ainsi, tu n'auras plus qu'à traiter :
- les espaces (Ex : 123 000)
- les point ou séparateur de milliers (123.000)
- et les virgules (123000,00).

Sinon, bonjour les dégâts.


Salut à tous !

Quelqu'un connait un bout de code regex pour retourne et/ou valider un
prix. Voici les formats que j'obtiens des utilisateurs.... c'est
presque infini.

123 000 $
123.000 $
123.000.00
123000
$123 000,00
123 $ / mois
123 / mois
120 000 nego
....
etc

pour ressortir en format 123 000 $

Quelqu'un connait déjà la recette miracle ?

Merci milles fois !


Avatar
louvois
Salut,

copie ce bout de code et teste. Et si ça te convient tu peux en faire
une fonction...

----- debut de code -----
<?
$entree = array("123 000 $","123.000 $","123.000.00","123000","$123
000,00"," 123 $ / mois","123 / mois","120 000 nego","123000.00");


for ($i=0;$i<sizeof($entree);$i++)
{
// enleve les espaces de debut et de la fin
$uno=trim($entree[$i]);

// enleve les espaces dans la chaine
$uno=str_replace(" ","",$uno);

// enleve au debut la caractère $
if ( $uno{0} == '$')
$uno=substr($uno, 1);

// remplace la chaine "$/mois" par "000"
$uno=str_replace('$/mois','000',$uno);


// remplace la chaine "/mois" par "000"
$uno=str_ireplace('/mois','000',$uno);

// virer la chaine "nego"
$uno=str_ireplace('nego','',$uno);


// lorsqu'il y a un "."
$tab=explode(".",$uno);
if ( sizeof($tab) == 2 )
{
if ( ($tab[0]/1000) > 1 )
$uno=$tab[0];
}
else if ( sizeof($tab) > 2 )
{
$uno = $tab[0] . $tab[1] ;
}

// lorsqu'il y a un ","
$tab=explode(",",$uno);
if ( sizeof($tab) == 2 )
{
if ( ($tab[0]/1000) > 1 )
$uno=$tab[0];
}
else if ( sizeof($tab) > 2 )
{
$uno = $tab[0] . $tab[1] ;
}

// Ok maintenant normaliser en un premier format
// en supprimant tous les "." et "$"
$uno=str_replace('.','',$uno);
$uno=str_replace('$','',$uno);

// format final
$premier = $uno / 1000 ;

echo "[ " . $entree[$i] . " ]". "--------------->" . $premier . "
000" . " $<br>" ;
}
?>
------ Fin de code -----

// Resultat

[ 123 000 $ ]--------------->123 000 $
[ 123.000 $ ]--------------->123 000 $
[ 123.000.00 ]--------------->123 000 $
[ 123000 ]--------------->123 000 $
[ $123 000,00 ]--------------->123 000 $
[ 123 $ / mois ]--------------->123 000 $
[ 123 / mois ]--------------->123 000 $
[ 120 000 nego ]--------------->120 000 $
[ 123000.00 ]--------------->123 000 $


By Prebagarane LOUVOIS,
Avatar
louvois
<?

// Debut Fonction formatter
function formatter($donnees)
{
$comment = array();
$entree = array();
$entree = $donnees;

for ($z=0;$z<sizeof($entree);$z++) $comment[$z] ="";

for ($i=0;$i<sizeof($entree);$i++)
{
// enleve les espaces de debut et de la fin
$uno=trim($entree[$i]);

// remplace le , par .
$uno=str_replace(",",".",$uno);
// supprimer le $
$uno=str_replace("$","",$uno);

// et mémoriser les autres caracteres dans le tableau $comment
$result = "";
for ($k=0;$k<strlen($uno);$k++)
{
if ( (($uno[$k] < '0' ) OR ($uno[$k] > '9' )) AND ((ord($uno[$k]) 32 ) OR (ord($uno[$k]) != 46 )) )
$result = $result . $uno[$k] ;
}
$comment[$i] = $result ;
// fin comment


// et aussi les autres chaines
$result = "";
for ($k=0;$k<strlen($uno);$k++)
{
if ( (( $uno[$k] >= '0' ) && ($uno[$k] <= '9' )) || ($uno[$k] == '.' )
)
$result = $result . $uno[$k] ;
}
$uno = $result ;



// maintenant on onleve les espaces dans la chaine
$uno=str_replace(" ","",$uno);


// enlever les derniers chiffres non significatifs
if ( strpos($uno,".") != FALSE )
{
$tab=explode(".",$uno);
$result = "";
$LAST = sizeof($tab)-1;
for($j=0;$j<(sizeof($tab)-1);$j++)
{
$result = $result . $tab[$j] ;
}
if ( strlen($tab[$LAST]) >= 2 )
$uno = $result ;
else
$uno = $result . $tab[$LAST] ;
}

// Ok maintenant normaliser en un premier format
// en supprimant tous les "." et "$"
$uno=str_replace('.','',$uno);


echo "[ " . $entree[$i] . " ]". "--------------->" . $uno . " $ ".
$comment[$i] . "<br>" ;
} // fin for

} // fin functions


$donnees = array ( "223.000.10", "123 000 $", "1.000.000.00 $ / par
mois", "$675 / mois", "670.00 par mois", "670 000 nego", "négotiable
170.000.00", "$132,312,32", "à discuter", "plus ou moins 5000.32 $",
"550 000$", "860.00$/ mois", "292 000.00", "1400 par mois", "139 900$",
"239000$", "250000", "$184,000.00", "162 000.00", "224,000.",
"199,000.$", "69,900", "229,000.00", "1,300.00", "72500.00",
"129,900.000", "139.900.00", "145 000 nego.", "$285,000", "173000.00",
"33000", "2,200,000", "670$ par mois", "89,000.00", "$289,900.00");

formatter($donnees);

?>