Détecter une majuscule dans un mot - PHP

[Résolu/Fermé]
Signaler
-
 Utilisateur anonyme -
Bonjour,

je suis actuellement à la recherche d'un script "passe partout". J'entends par là qu'une fois mis en place : il me suffirait de suivre une convention de nommage pour que le script fonctionne tout le temps.

Le cas est le suivant : j'ai une table qui se nomme " personne ".
Elle peut contenir X champs.

J'ai une page qui affiche les informations actuelles et en même temps un formulaire pour les modifier.

Ma convention de nommage est la suivante :

[information]_[nom de la table]
exemple : prenom_personne,
cp_personne
etc..

Code actuel :

data est un tableau contenant les informations d'une personne de la table.


foreach($data as $cle => $element)
{
    $mots = explode("_", $cle); //séparation des mots à chaque "_"

    /* Ici on obtient donc :
          mot[0] = cp
          mot[1] = personne */

   //J'affiche donc mon label pour chaque champ
     <label for=" ' .$cle. ' "> ' .$mots[0]. ' </label>
}


Le problème c'est que visuellement le formulaire n'est pas très explicite, vu qu'on voit apparaître :

cp 74000 [input de type text vide]

Je voudrais donc qu'à la place du cp on affiche : Code Postal

ma première idée était de nommer mon champ de cette façon :

codePostal_personne. Mais je ne trouve pas de fonction php pour détecter la majuscule.

On pourrait alors mettre un tableau contenant les 24 lettres de l'alphabet en majuscule et utiliser la fonction explode. Mais est-ce que ça ne serait pas lourd ?

Sinon écrire " code-postal_personne " et à nouveau utiliser explode.

Mais est-ce que ce n'est pas déconseillé de nommer un champ de cette façon dans la table ?

2)

Pour ce qui est du champ prenom :je voudrais mettre l'accent pour obtenir : Prénom.

Puis-je le mettre directement dans la bdd ? Sinon il me semble impossible de rajouter cette accents à moins de le spécifier dans le script.

  if(prenom_personne == $cle){
      mots[0] = "prénom";
  }


Et au final s'il y a 10 champs avec des accents je devrais faire les 10 champs ce qui n'est pas top !

Merci à ceux qui ont lu ce post :).

4 réponses

Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
Avec ceci tu trouves dans $result la premiere majscule de $data...

if (preg_match('#^[^A-Z]*([A-Z])#',$data,$result))
$result=$result[1];
else unset($result);

Avec ceci tu trouves dans $result la premiere majscule ainsi que toute la suite de caracteres de $data...

if (preg_match('#^[^A-Z]*([A-Z].*)#',$data,$result))
$result=$result[1];
else unset($result);

Abandonne ce qui te trouble au profit de ce qui apaise ton coeur.
4
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
j'ai modifié le code car j'avais oublié l'étoile dans la regex *
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
function explode_maj($t=false){ if ($t) return explode(' ',trim(preg_replace('#([A-Z])#',' $1',$t)));} 

$k=explode_maj('SalutCeciEstUnTestPourVoirSiLaFonctionDiviseBienUnTexteTresLongLol'); print_r($k); 

$k=explode_maj('ApparamentCaFonctionneMEMEAvecUnSeulCaractèreOuDesChiffres57320ParExemple'); print_r($k); 

$k=explode_maj('Lol'); print_r($k);

retourne
Array ( [0] => Salut [1] => Ceci [2] => Est [3] => Un [4] => Test [5] => Pour [6] => Voir [7] => Si [8] => La [9] => Fonction [10] => Divise [11] => Bien [12] => Un [13] => Texte [14] => Tres [15] => Long [16] => Lol ) 

Array ( [0] => Apparament [1] => Ca [2] => Fonctionne [3] => M [4] => E [5] => M [6] => E [7] => Avec [8] => Un [9] => Seul [10] => Caractère [11] => Ou [12] => Des [13] => Chiffres57320 [14] => Par [15] => Exemple ) 

Array ( [0] => Lol ) 
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
pour faire des essais si $test est un array qui provient de ta base de données:
<?php
function explode_maj($t=false){ if ($t) return explode(' ',trim(preg_replace('#([A-Z])#',' $1',$t)));}
$b='\',\'';
$test=array('SalutCeciEstUnTestPourVoirSiLaFonctionDiviseBienUnTexteTresLongLol','DeuxMots','Un','57','MAJUSCULES');
foreach ($test as $value) echo "<h2>$value</h2>".trim('$k = array(\''.implode($b, explode_maj($value)).'\');');
?>


Abandonne ce qui te trouble au profit de ce qui apaise ton coeur.
Utilisateur anonyme
j'ai beau relire la doc je comprend pas à quoi sert le $1 de preg_replace.
Tu remplaces toutes les maj par ' $1' (un espace et la variable 1) ?
Et ensuite avec explode tu remplaces ' $1' par un espace ?

Et pour finir tu remplace tous les espaces par ',' pour les mettre dans le tableau qui s'appel $k ?
Utilisateur anonyme
C'est bon j'ai compris lol.
On cherche les majuscules. Chaque fois qu'on tombe sur une, elle est mis dans $1. Et vu qu'on remplace les maj par ' $1'. On remplace en fait la majuscule par un espace et la majuscule en question.
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
tu peux faire une fonction de réécriture, mais il faudrait plus de détails... une regex match touts les couples [information]_[nom de la table] la fonction réécrit le champ [information] et retourne le résultat...

@ktm

Un grand merci, j'ai pu utiliser ta fonction. Elle répond parfaitement aux attentes.

if (preg_match('#^[^A-Z]*([A-Z].*)#',"codePostal",$result)){
	$result = $result[1];
	echo $result;
}

// Si d'autre lise ce post, pour afficher le tableau :
echo '<pre>';
print_r($result) ;
echo '</pre>';


Cependant j'ai essayé avec un autre mot. Admettons : motDePasse.
Pour séparer "de" et "passe" : on relance la fonction ?
Je pensais que preg_match_all ferait l'affaire. Mais ce n'est pas le cas, à moins que je l'ai mal utilisée ?
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
Avec ceci tu trouves dans le tableau $result la premiere majscule du premier mot et la première majuscule du deuxième mot de $data...

if (preg_match('#^[^A-Z]*([A-Z])[a-z]*?([A-Z])#',$data,$result))   
$result=array($result[1],$result[2]);   
else unset($result);

Avec ceci tu trouves dans le tableau $result la premiere majscule et toutes les minuscules du premier mot et la première majuscule et toutes les minuscules du deuxième mot de $data...

if (preg_match('#^[^A-Z]*([A-Z][a-z]*?)([A-Z][a-z]*?)#',$data,$result))   
$result=array($result[1],$result[2]);   
else unset($result);

Avec ceci tu trouves dans le tableau $result la premiere majscule et toutes les minuscules et les chiffres du premier mot et la première majuscule et toutes les minuscules et les chiffres du deuxième mot de $data...

if (preg_match('#^[^A-Z]*([A-Z][a-z0-9]*?)([A-Z][a-z0-9]*?)#',$data,$result))   
$result=array($result[1],$result[2]);   
else unset($result);

Avec ceci tu trouves dans le tableau $result la premiere majscule et tout le reste du premier mot et la première majuscule et toutes le reste de l'expression $data...

if (preg_match('#^[^A-Z]*([A-Z][^A-Z]*?)([A-Z].*)#',$data,$result))   
$result=array($result[1],$result[2]);   
else unset($result);
Utilisateur anonyme
En effet la fonction remplie sont rôle. J'ai enfin compris globalement comment marchait les regex.

Mais j'ai des zone floues dans ce que tu as mis.

^[^A-Z]* --> en début de chaîne on ne doit pas trouver de majuscule.

([A-Z][^A-Z]*?) --> dans la variable numéro 2 : On doit trouver une majuscule, puis des minuscule (0,1 ou plusieurs fois = *) mais à quoi sert le ? (puisqu'il dit aussi que c'est facultatif ?)

Finalement mon script final :
<?php
$text = "UnJourMonAncetreGurdil";
//On supprime toutes les minuscules
$majuscule = preg_replace('#[a-z]#','', $text);
//On compte le nombre de majuscules
$nbrMajuscule = strlen($majuscule);

/* Régex qui permet d'obtenir une majuscule et les minuscules, ne pas oublier les #
voir Site du zero Memento des expressions régulières */
$regexInitiale='([A-Z][^A-Z]*)';
$regexFinale = ' ';

//On créer la régex en ajoutant l'initiale pour chaque mot
FOR($iBcl=0;$iBcl<$nbrMajuscule;$iBcl++){
	$regexFinale .= $regexInitiale;
}

//On rajoute les # de chaque côté
$regexFinale = "#" . $regexFinale . "#";

//On effectue la requête
if (preg_match($regexFinale,$text,$result)){  
	//La première ligne est supprimée car elle contient toute la variable $text
	unset($result[0]);
	/* Affichez le tableau de résultat
	echo '<pre>';
	print_r($result) ;
	echo '</pre>'; 
	*/
}else{ 
	unset($result);
}
?>


Un grand merci pour ton aide :).
Messages postés
293
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
12 mars 2013
39
Tout ton script =
$text = 'UnJourMonAncetreGurdil';         
$result = explode(' ',trim(preg_replace('#([A-Z])#',' $1',$text)));

exemple
SalutCeciEstUnTestPourVoirSiLaFonctionDiviseBienUnTexteTresLongLol   
retourne
Array ( [0] => Salut [1] => Ceci [2] => Est [3] => Un [4] => Test [5] => Pour [6] => Voir [7] => Si [8] => La [9] => Fonction [10] => Divise [11] => Bien [12] => Un [13] => Texte [14] => Tres [15] => Long [16] => Lol ) 
Utilisateur anonyme
LoL.

Il y a des jours où j'aimerais avoir vôtre expérience j'ai passé l'après-midi à faire la fonction et t'as mis 1h pour le même résultat en plus propre et moins long ...