2012-03-26 11 views
1

Ich habe eine Zeichenfolge: 'Some_string_to_capitalize', die ich in 'Some_String_To_Capitalize' transformieren möchte. Ich habe versucht:Wie machen Sie Preg_replace erfasst Großbuchstaben (PHP)?

$result = preg_replace('/(_([a-z]{1}))/' , strtoupper('$1') , $subject ) 

und

$result = preg_replace('/(_([a-z]{1}))/' , "strtoupper($1)" , $subject ) 

ich auf der PHP-man-Seite geschaut und hier auf SO, aber nichts gefunden. Entschuldigung, wenn das ein Duplikat ist!

This is the equivalent SO question for Javascript.

Antwort

6

Ich glaube, Sie wollen preg_replace_callback verwenden:

In PHP 5.3+

<?php 
$subject = 'Some_string_to_capitalize'; 
$result = preg_replace_callback(
    '/(_([a-z]{1}))/', 
    function ($matches) { 
     return strtoupper($matches[0]); 
    } , 
    $subject 
); 

Für PHP unter 5,3

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

$result = preg_replace_callback('/(_([a-z]{1}))/', 'toUpper', $subject); 
+0

+1 Howard antwortete zuerst, also gab ich Das akzeptierte ihn aber das war auch eine äußerst informative Antwort. Vielen Dank! – AndyPerlitch

+1

Es geht nicht darum, wer zuerst antwortet, sondern darum, ob die Antwort gut ist. Der Modifikator "/ e" ist keine gute Idee. Es kann gefährlich sein, es ist jetzt veraltet und wird irgendwann komplett aus PHP entfernt. –

+0

@Josh Davis Ich habe gegoogelt und Sie haben absolut Recht mit den Sicherheitsbedenken. Zu der Zeit, als ich Howards Antwort akzeptierte, sah ich keinen klaren Vorteil zwischen seinem und Davids. Danke, dass du darauf hingewiesen hast. – AndyPerlitch

1

Versuchen Sie, den Buchstaben "e" (dh eval) als Modifikator zu Ihrem regulären Ausdruck hinzuzufügen.

$result = preg_replace("/(_([a-z]{1}))/e" , "strtoupper(\\1)" , $subject); 
+0

Ehrfürchtig. Eine Sache, die Sie vergessen haben, war, einfache Anführungszeichen um \\ 1 zu setzen. Versucht zu bearbeiten und SO abgelehnt ... versucht, Ihre Antwort zu akzeptieren und sagte, ich könnte nach 4 Minuten. Sind diese Maßnahmen neu? – AndyPerlitch

+0

Ich denke, dass die \\ 1 zitiert werden muss, damit das funktioniert. –

+0

Es funktioniert mit doppelten Anführungszeichen in meiner PHP-Testumgebung. – Howard

1

Ich denke, dass Sie zuerst nicht strtoupper wollen. Das wird nur den ersten Buchstaben jedes Matches großschreiben, nicht das ganze Match wie strtoupper. Ich denke auch, dass du zu preg_replace_callback wechseln musst, weil deine aktuelle Syntax php anweist, strtoupper in der Zeichenkette '$ 1' (die nichts tut) auszuführen und diese dann als Ersetzungszeichenfolge für ALLE Übereinstimmungen zu übergeben gemacht. Das würde Ihnen genau die gleiche Ausgabe wie Eingabe geben.

Versuchen Sie stattdessen:

<?php 
preg_replace_callback(
    '/(_([a-z]{1}))/', 
    create_function(
     // single quotes are essential here, 
     // or alternative escape all $ as \$ 
     '$matches', 
     'return ucfirst($matches[0]);' 
    ), 
    $subject 
); 
?> 
+0

+1 aus dem gleichen Grund wie der Kommentar zu @David Stocktons Antwort. Vielen Dank! – AndyPerlitch

+0

ps eigentlich das Muster Ich habe nur die Unterstreichung und den ersten Buchstaben erfasst so brauchte ich nicht zuerst – AndyPerlitch

+0

Ah ja, ich sah nicht wirklich auf die Regex lol, aber ich sehe das jetzt: P – Brian

1

Sie habe eine gute Antwort bis jetzt gepostet; aber ich dachte, dass ich eine Variation schreiben würde nur für Kicks:

[aktualisiert] bearbeitet Code snipped mehr terse zu sein:

<?php 

$string = 'Some_strIng_to_caPitÃliZe'; 
echo mb_convert_case($string, MB_CASE_TITLE, 'UTF-8'); 
// Some_String_To_Capitãlize 

Der obige Code hält die folgende:

  1. Unicode-Zeichen können Teil der Zeichenfolge sein; in diesem Fall sollte 'UTF-8' eine sichere Codierung sein:

  2. mb_convert_case die Flagge mit MB_CASE_TITLE Pflegen von Worten nimmt, die mit einem gemischten Fall kommen, also müssen wir nicht manuell normalisieren und „_“ ist ein Wort betrachtet Grenze.

  3. Die mb_convert_case Funktion arbeitet mit PHP-Versionen seit 4.3.0

PHP Source Referenz.