10
votes

Comment capitaliser la première lettre du premier mot dans une phrase?

J'essaie d'écrire une fonction pour nettoyer la saisie de l'utilisateur.

Je n'essaie pas de le rendre parfait. Je préférerais avoir quelques noms et acronymes en minuscule qu'un paragraphe complet en majuscule.

Je pense que la fonction devrait utiliser des expressions régulières, mais je suis plutôt mauvais avec ceux qui ont besoin d'aide.

Si les expressions suivantes sont suivies d'une lettre, je veux faire de cette lettre majuscule. xxx

encore meilleur, la fonction pourrait ajouter un espace après "". , "!" et "?" Si ceux-ci sont suivis d'une lettre.

Comment cela peut être atteint?


1 commentaires

Offrant une entrée de l'échantillon réaliste et une sortie souhaitée sont des parties vitales de la création d'un exemple de reproductible minimal .


7 Réponses :


1
votes

chaîne séparée en tableaux en utilisant ./!/? comme délimiteur. Boucle à travers chaque chaîne et utilisez ucfirst (strtoolower ($ actuelle string)) , puis rejoignez-les à une seule chaîne.


1 commentaires

Prise intéressante. Je vais essayer. J'espérais pratiquer ma regex un peu mais cela pourrait faire le travail. Merci.



3
votes

Voici le code qui fait comme vous le souhaitez: xxx

sortie: coller votre code! Au dessous de. CodePad va l'exécuter. Êtes-vous sûr? OK


1 commentaires

Vous n'avez plus besoin de créer_function :) (



0
votes
$output = preg_replace('/([\.!\?]\s?\w)/e', "strtoupper('$1')", $input)

1 commentaires

Preg_replace (): Le modificateur / e / e n'est plus pris en charge, utilisez Preg_replace_callback à la place.



1
votes

Ceci:

<?
$text = "abc. def! ghi? jkl.\n";
print $text;
$text = preg_replace("/([.!?]\s*\w)/e", "strtoupper('$1')", $text);
print $text;
?>

Output:
abc. def! ghi? jkl.
abc. Def! Ghi? Jkl.


0 commentaires

33
votes
$output = preg_replace_callback('/([.!?])\s*(\w)/', function ($matches) {
    return strtoupper($matches[1] . ' ' . $matches[2]);
}, ucfirst(strtolower($input)));

5 commentaires

@ W35L3Y Votre code m'intéresse ... Mais comment faire si ma chaîne est avec des tags comme celle-ci, par exemple: Bonjour. Cela ne fonctionne pas! ...? Pouvez-vous améliorer votre code s'il vous plaît pour ce genre de cas? En fait, comment échapper à sans les supprimer? Merci :)


@Zagloo, dans le cas ci-dessus, il est nécessaire d'avoir seulement 1 espace de manière indépendante du nombre actuel d'espaces. Dans votre cas, il est soumis à une nouvelle question. Envisagez de demander à un nouveau et laissez-moi savoir. En bref, je n'ai pas de bonnes nouvelles pour vous car un span sans aucun attribut n'est facile, mais qu'en est-il des nœuds nichés avec divers attributs chacun?


@ W35L3Y THX pour votre retour! J'ai fait un nouveau post hier et quelqu'un a trouvé la solution ici: Stackoverflow.com/Questtions/29366592/... ; O)


Bonjour. Je ne comprends pas la partie [.!?] de l'expression régulière. Le point non évalué ne devrait-il pas correspondre à un caractère (y compris «!» Et «?»)? Je pense que cela devrait être échappé mais cette réponse a été ici beaucoup de temps ...


@Nedark, dans un [] bloque n'importe quel caractère sauf - ^ \] est un littéral.



1
votes

Et ça? Sans regex.

$letters = array(
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
);
foreach ($letters as $letter) {
    $string = str_replace('. ' . $letter, '. ' . ucwords($letter), $string);
    $string = str_replace('? ' . $letter, '? ' . ucwords($letter), $string);
    $string = str_replace('! ' . $letter, '! ' . ucwords($letter), $string);
}


0 commentaires

-2
votes
$Tasks=["monday"=>"maths","tuesday"=>"physics","wednesday"=>"chemistry"];

foreach($Tasks as $task=>$subject){

     echo "<b>".ucwords($task)."</b> : ".ucwords($subject)."<br/>";
}

0 commentaires