Detectar una mayúscula en una palabra - PHP

Resuelto
Usuario anónimo -  
 Usuario anónimo -
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 respuestas

  1. ktm620enduro Mensajes publicados 377 Estado Miembro 38
     
    Con esto encuentras en $result la primera mayúscula de $data...

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

    Con esto encuentras en $result la primera mayúscula así como toda la secuencia de caracteres de $data...

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

    Abandona lo que te inquieta en favor de lo que tranquiliza tu corazón.
    4
    1. ktm620enduro Mensajes publicados 377 Estado Miembro 38
       
      He modificado el código porque había olvidado la estrella en la expresión regular *
      0
    2. ktm620enduro Mensajes publicados 377 Estado Miembro 38
       
      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 ) 
      0
  2. ktm620enduro Mensajes publicados 377 Estado Miembro 38
     
    Para hacer pruebas, si $test es un arreglo que proviene de tu base de datos:
     <?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.
    2
    1. Usuario anónimo
       
      Intento de traducción al español: Aun así releo la documentación y no entiendo para qué sirve $1 en preg_replace.
      ¿Reemplazas todas las mayúsculas por ' $1' (un espacio y la variable 1)?
      ¿Y luego con explode reemplazas ' $1' por un espacio?

      ¿Y por fin reemplazas todos los espacios por ',' para meterlo en el arreglo que se llama $k?
      0
    2. Usuario anónimo
       
      Es correcto, ya lo entiendo lol.
      Buscamos las mayúsculas. Cada vez que encontramos una, se pone en $1. Y como reemplazamos las mayúsculas por ' $1', en realidad reemplazamos la mayúscula por un espacio y la mayúscula en cuestión.
      0
  3. ktm620enduro Mensajes publicados 377 Estado Miembro 38
     
    puedes hacer una función de reescritura, pero haría falta más detalles... una regex que haga match de todos los pares [información]_[nombre de la tabla] la función reescribe el campo [información] y devuelve el resultado...
    --
    Abandona lo que te perturba en favor de lo que apacigua tu corazón.
    1
  4. Usuario anónimo
     
    @ktm

    Muchas gracias, pude usar tu función. Responde perfectamente a las expectativas.

     if (preg_match('#^[^A-Z]*([A-Z].*)#',"codePostal",$result)){ $result = $result[1]; echo $result; } // Si alguien más lee este post, para mostrar la tabla : echo '<pre>'; print_r($result) ; echo '</pre>'; 


    Sin embargo probé con otra palabra. Supongamos: motDePasse.
    Para separar "de" y "passe" : ¿volvemos a llamar a la función?
    Pensé que preg_match_all haría el trabajo. Pero no es así, a menos que lo haya usado mal?
    0
    1. ktm620enduro Mensajes publicados 377 Estado Miembro 38
       
      Con esto encuentras en la matriz $result la primera mayúscula de la primera palabra y la primera mayúscula de la segunda palabra de $data...

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

      Con esto encuentras en la matriz $result la primera mayúscula y todas las minúsculas de la primera palabra y la primera mayúscula y todas las minúsculas de la segunda palabra 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);

      Con esto encuentras en la matriz $result la primera mayúscula y todas las minúsculas y los dígitos de la primera palabra y la primera mayúscula y todas las minúsculas y los dígitos de la segunda palabra 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);

      Con esto encuentras en la matriz $result la primera mayúscula y todo el resto de la primera palabra y la primera mayúscula y todo el resto de la expresión de $data...

      if (preg_match('#^[^A-Z]*([A-Z][^A-Z]*?)([A-Z].*)#',$data,$result)) $result=array($result[1],$result[2]); else unset($result);
      0
    2. Usuario anónimo
       
      En efecto la función cumplida es su función. Por fin he entendido globalmente cómo funcionaban las expresiones regulares.

      Pero tengo zonas oscuras en lo que has puesto.

      ^[^A-Z]* --> al inicio de la cadena no debe haber mayúsculas.

      ([A-Z][^A-Z]*?) --> en la variable número 2: debemos encontrar una mayúscula, luego minúsculas (0,1 o varias veces = *), pero ¿para qué sirve el ? (ya que también dice que es opcional ?)

      Finalmente mi script final:
       <?php $text = "UnJourMonAncetreGurdil"; //Se eliminan todas las minúsculas $majuscule = preg_replace('#[a-z]#','', $text); //Contamos el número de mayúsculas $nbrMajuscule = strlen($majuscule); /* RegExp que permite obtener una mayúscula y las minúsculas, no olvidar las # ver Site du Zero Memento des expressions régulières */ $regexInitiale='([A-Z][^A-Z]*)'; $regexFinale = ' '; //Creamos la expresión añadiendo la inicial para cada palabra FOR($iBcl=0;$iBcl<$nbrMajuscule;$iBcl++){ $regexFinale .= $regexInitiale; } //Añadimos los # de cada lado $regexFinale = "#" . $regexFinale . "#"; //Hacemos la consulta if (preg_match($regexFinale,$text,$result)){ //La primera línea se elimina porque contiene toda la variable $text unset($result[0]); /* Muestra el arreglo de resultados echo '<pre>'; print_r($result) ; echo '</pre>'; */ }else{ unset($result); } ?> 


      Un gran gracias por tu ayuda :).
      0
    3. ktm620enduro Mensajes publicados 377 Estado Miembro 38
       
      Todo su script =
       $text = 'UnJourMonAncetreGurdil'; $result = explode(' ',trim(preg_replace('#([A-Z])#',' $1',$text)));

      ejemplo
      SalutCeciEstUnTestPourVoirSiLaFonctionDiviseBienUnTexteTresLongLol 
      devuelve
      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 ) 
      0
    4. Usuario anónimo
       
      Jaja.

      Hay días en los que me gustaría tener vuestra experiencia. Pasé la tarde haciendo la función y tú pusiste 1 hora para obtener el mismo resultado, pero más limpio y menos largo ...
      0