2010-04-14 12 views
14

j'ai des noms comme celui-ci:preg_replace à une lettre en majuscule après une citation

$str = 'JAMES "JIMMY" SMITH' 

je lance strtolower, puis ucwords, qui retourne ceci:

$proper_str = 'James "jimmy" Smith' 

Je voudrais profiter de la deuxième lettre de mots dans laquelle la première lettre est une double citation. Voici l'expression rationnelle. Il semble que strtoupper ne fonctionne pas - l'expression rationnelle renvoie simplement l'expression originale inchangée.

$proper_str = preg_replace('/"([a-z])/',strtoupper('$1'),$proper_str); 

Des indices? Merci!!

+0

Quelle sortie attendez-vous? – codaddict

Répondre

20

Utilisez le e modifier avoir évalué la substitution:

preg_replace('/"[a-z]/e', 'strtoupper("$0")', $proper_str) 

$0 contient le match du motif entier, ainsi " et la lettre minuscule. Mais cela n'a pas d'importance puisque le " ne change pas lorsqu'il est envoyé par strtoupper.

+0

A travaillé comme un charme Merci – Summer

+0

Je pense que je l'ai rendu plus difficile que nécessaire pour être' strtoupper ('"') === '"' '. ;-) – Gumbo

+20

Apparemment l'option 'e' est une faille de sécurité sévère et ils recommandent d'utiliser' preg_replace_callback() 'à la place. FYI. –

31

Probablement la meilleure façon de faire est d'utiliser :

$str = 'JAMES "JIMMY" SMITH'; 
echo preg_replace_callback('!\b[a-z]!', 'upper', $str); 

function upper($matches) { 
    return strtoupper($matches[0]); 
} 

Vous pouvez utiliser le e (eval) drapeau sur preg_replace() mais je conseille généralement contre. Particulièrement lorsqu'il s'agit de l'entrée externe, il est potentiellement extrêmement dangereux.

+0

J'ai reçu une erreur indiquant que 'upper' n'est pas un callback valide.Quand j'ai remplacé 'upper' par 'strtoupper', j'ai 'ARRAY' au lieu de majuscule 'J' – Summer

+0

@Summer alors vous n'avez pas défini la fonction 'upper()' selon mon extrait de code. – cletus

+0

Comme vous avez raison. Merci. – Summer

0

Quelque chose comme cela pourrait faire l'affaire:

preg_replace("/(\w+)/e", "ucwords(strtolower('$1'))", $proper_str); 
0

Je le fais sans regex, dans le cadre de ma fonction personnalisée ucwords(). En supposant plus de deux citations apparaissent dans la chaîne:

$parts = explode('"', $string, 3); 
if(isset($parts[2])) $string = $parts[0].'"'.ucfirst($parts[1]).'"'.ucfirst($parts[2]);    
else if(isset($parts[1])) $string = $parts[0].'"'.ucfirst($parts[1]); 
16

Utilisez preg_replace_callback - Mais vous ne avez pas besoin d'ajouter une fonction nommée supplémentaire, utilisez plutôt une fonction anonyme.

$str = 'JAMES "JIMMY" SMITH'; 
echo preg_replace_callback('/\b[a-z]/', function ($matches) { 
    return strtoupper($matches[0]); 
}, $str); 

L'utilisation de /e est désapprouvée à partir de PHP 5.5 et ne fonctionne pas en PHP 7

0

Vous devriez faire ceci:

$proper_str = 
    preg_replace_callback(
     '/"([a-z])/', 
     function($m){return strtoupper($m[1]);}, 
     $proper_str 
); 

Vous should'nt utiliser « eval() " pour des raisons de sécurité.

De toute façon, le modificateur patern "e" est déprécié. Voir: PHP Documentation.

0
echo ucwords(mb_strtolower('JAMES "JIMMY" SMITH', 'UTF-8'), ' "'); // James "Jimmy" Smith 

ucwords() a un second paramètre de délimiteur, les délimiteurs en option contient le mot caractères de séparation. Utilisez espace '' et " comme délimiteur là et "Jimmy" sera correctement reconnu.

Questions connexes