2011-03-21 5 views
8

J'essaye d'écrire une fonction pour nettoyer l'entrée d'utilisateur.Comment mettre en majuscule la première lettre du premier mot d'une phrase?

Je n'essaie pas de le rendre parfait. Je préférerais avoir quelques noms et acronymes en minuscules plutôt qu'un paragraphe complet en majuscules.

Je pense que la fonction devrait utiliser des expressions régulières, mais je suis assez mauvais avec ceux-ci et j'ai besoin d'aide.

Si les expressions suivantes sont suivies d'une lettre, je veux mettre cette lettre en majuscule.

"." 
". " (followed by a space) 
"!" 
"! " (followed by a space) 
"?" 
"? " (followed by a space) 

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

Comment cela peut-il être réalisé?

+1

Bonne chose que cela n'a rien à voir avec un forum. Au lieu de supposer ce que j'essaie de faire, que diriez-vous de l'aide? – Enkay

+2

Vous n'avez pas besoin de plus d'informations. J'ai expliqué ce que j'essaie de faire clairement. Si vous pouvez aider, faites-le mais s'il vous plaît, allez troll ailleurs. – Enkay

+2

@Dagon @Enkay Soyez plus respectueux les uns envers les autres. @Dagon S'il y a quelque chose de particulier que vous aimeriez @Enkay, pourquoi ne pas le demander? – marcog

Répondre

30
$output = preg_replace('/([.!?])\s*(\w)/e', "strtoupper('\\1 \\2')", ucfirst(strtolower($input))); 

Depuis le modificateur e est dépréciée en PHP 5.5.0:

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

Merci – Enkay

+1

Pas de problème. :) – w35l3y

+5

Pour rappel, le modificateur e est déconseillé en PHP 5.5 –

1

Séparez les chaînes en tableaux en utilisant ./!/? comme délimiteur. Parcourez chaque chaîne et utilisez ucfirst(strtolower($currentString)), puis joignez-les à nouveau dans une chaîne.

+0

Prendre intéressant. Je vais essayer. J'espérais pratiquer un peu mon regex mais cela pourrait faire le travail. Je vous remercie. – Enkay

3

Voici le code qui fait que vous vouliez:

<?php 

$str = "paste your code! below. codepad will run it. are you sure?ok"; 

//first we make everything lowercase, and 
//then make the first letter if the entire string capitalized 
$str = ucfirst(strtolower($str)); 

//now capitalize every letter after a . ? and ! followed by space 
$str = preg_replace_callback('/[.!?] .*?\w/', 
    create_function('$matches', 'return strtoupper($matches[0]);'), $str); 

//print the result 
echo $str . "\n"; 
?> 

SORTIE:Paste your code! Below. Codepad will run it. Are you sure?ok

+0

vous n'avez plus besoin de create_function:) ( – dynamic

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

Ce:

<? 
$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. 

Notez que vous ne pas h ave pour échapper.!? à l'intérieur [].

0

Comment cela? 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); 
} 

J'ai bien travaillé pour moi.

Questions connexes