Chaine de caractères

Répondre
Taly
le 06/10/2004 à 10:27
Taly
Hello !!

Voila j'ai un petit problème avec une variable qui contient une chaine de caractères.

Je souhaiterai que toutes la chaine soit en minuscules (j'ai utilisé strtolower() est c'est ok) mais que chaque première lettre d'une nouvelle phrase soit en majuscule. J'ai trouvé ucfirst() mais cette fonction ne met que la première lettre en majuscule de toute ma chaine, hors ma chaine comporte plusieurs phrases.

Comment faire ??

Voici ma variable :

$texte="BONJOUR. MES TESTS NE FONCTIONNENT PAS. QUE FAIRE ?" ;
$texte= ucfirst(strtolower($_POST["texte"]) ) ;


Merci pour votre aide...
mojorisin
le 06/10/2004 à 10:49
mojorisin
Ceci devrait faire l'affaire. (pas testé)
$texte = preg_replace("/(?<=[\.\?!]\s?)(\w)/",ucfirst($1),$texte);
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
Taly
le 06/10/2004 à 11:07
Taly
merci pour ta réponse mais cela ne fonctionne pas... Le message d'erreur est le suivant :

Parse error: parse error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in ...
piett
le 06/10/2004 à 12:18
piett
Salut,
J'ai essayer ton code, il fonctionne quand je remplace
$_POST["texte"] par $texte.
"Des millions d'esprits ouverts ne peuvent avoir tort" Linux ;-)
piett
le 06/10/2004 à 12:19
piett
Je me reprends.
La première lettre est effectivement en minuscule. Mais c'est normal avec cette fonction.
"Des millions d'esprits ouverts ne peuvent avoir tort" Linux ;-)
LA GLOBULE
le 06/10/2004 à 12:43
LA GLOBULE
Voici un élément de réponse :

<?php
function ma_fct ($find) {
return $find[1].' '.ucfirst($find[3]);
}
$texte = 'BONJOUR. MES TESTS NE FONCTIONNENT PAS. QUE FAIRE ? VOILA UNE SOLUTION !';
$texte = strtolower($texte);
$texte = ucfirst($texte);
$texte = preg_replace_callback("/([\.\?!])(.+?)([a-zA-Z])?/", ma_fct, $texte);

echo $texte;
?>


Ce qui m'affiche :

Bonjour. Mes tests ne fonctionnent pas. Que faire ? Voila une solution !


PS : en faisant deux trois tests, ce code ne fonctionne plus si on a deux espaces ou plus entre chaque phrase. Il faudrait revoir un peu le pattern, mais je suis une quiche en regex :/

[Message modifié le 06/10/2004 à 12:53 par LA GLOBULE]
mojorisin
le 06/10/2004 à 13:27
mojorisin
Bon, en fait la fonction se comporte de manière bizarre.
Tiens voilà un code fonctionnel :

<?php
$texte="BONJOUR. MES TESTS NE FONCTIONNENT PAS! QUE FAIRE ?JE SAIS PAS" ;
$texte= strtolower($texte) ;

$pattern = "/(?<=[\.\?!])\s?(\w+)/e";
$replace = "ucwords(\$1)";
$texte = preg_replace($pattern,$replace,$texte);
echo $texte;
?>


[Message modifié le 06/10/2004 à 14:12 par LA GLOBULE]
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
Taly
le 07/10/2004 à 08:42
Taly
Je vous remercie pour vos soluces... je vais les tester aussi !

J'en ai trouvée une aussi qui pourrait coller :j'ai testé avec ce code et ça fonctionne

<?php
$MaChaine = "Salut tout le monde. sale temps dehors. vivement l'été prochain.";
$MaChaine = str_replace(". ",".",$MaChaine);

$Chaines = explode(".",$MaChaine);
$NbChaines = sizeof($Chaines);

for($i = 0 ; $i < $NbChaines ; $i++)
$Chaines[$i] = ucfirst($Chaines[$i]);

$MaChaine = implode(". ",$Chaines);
echo $MaChaine;
?>


mais j'ai encore un petit bug : dans cet exemple, $MaChaine ne comporte par de <br> ou de /n hors mais j'ai des cas où il y en a. J'ai des variables du type :

$texte="BONJOUR TOUT LE MONDE.

MES TESTS NE FONCTIONNENT PAS.

QUE FAIRE ?" ;


et dans ce cas mon premier code ne fonctionne que sur la première ligne (BONJOUR TOUT LE MONDE.) avant le retour à la ligne.

Quelqu'un aurait des suggestions pour résoudre ce petit problème ?
Merci à vous...
LA GLOBULE
le 07/10/2004 à 12:14
LA GLOBULE
C'est normal, vu que tu travailles avec des explode et des str_replace (et de plus, dans ton cas, seul le point est utilisé comme élément de fin de phrase, alors qu'il y a aussi le ? et le !, voir meme le ; ).

Pour faire un truc vraiment propre, il faut utiliser les expressions régulières.

J'ai essayé, mais mon code ne marche pas lorsqu'il y a plusieurs espaces avant ou apres un signe de ponctuation (qui marque la fin d'une phrase).

Bref, ton truc n'est pas impossible à faire, mais faudrait trouver un pro de la regex.
mojorisin
le 07/10/2004 à 23:42
mojorisin
Bah ma regexp fonctionne tip top smiley
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
Répondre
LoadingChargement en cours