2012-03-26 7 views
1

私は 'Some_string_to_capitalize'に変換したい文字列 'Some_string_to_capitalize'を持っています。私が試してみました:preg_replaceキャプチャをどのように大文字(php)にしますか?

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

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

を私はPHPのmanページを見て、ここでのSOにしか見つかりませんでした。これはダップ場合はお詫び!

This is the equivalent SO question for Javascript

答えて

6

は、私はあなたがpreg_replace_callbackを使用したいと思う:PHP 5.3+で

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

PHP 5.3

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

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

+1ハワード最初の答え: – AndyPerlitch

+1

誰が最初に答えを出すのではなく、答えが良いかどうかについてです。/e修飾子は良い考えではありません。これは危険なことがあります。現在は非難されており、ある時点でPHPから完全に削除されます。 –

+0

@Josh Davis私はいくつかのグーグルをして、あなたは安全上の懸念について絶対に正しいです。私がハワードの答えを受け入れたとき、彼とダビデの間にはっきりとした利点はなかった。それを指摘してくれてありがとう。 – AndyPerlitch

1

正規表現に修飾語として「e」(意味eval)を追加してみてください。

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

驚くばかりです。あなたが忘れていたことは、\\ 1の周りに一重引用符を付けることでした。編集しようとしましたが、SOが拒否しました...あなたの答えを受け入れるようにしましたが、SOは4分後にできると言いました。これらの対策は新しいのでしょうか? – AndyPerlitch

+0

私は、\\ 1はそれが動作するために引用する必要があると思います。 –

+0

私のPHPテスト環境では二重引用符で動作します。 – Howard

1

私はあなたがstrtoupperではないと思っています。それはstrtoupperのようなマッチ全体ではなく、各マッチの最初の文字だけを大文字にします。私はあなたが現在の構文でPHPにstrtoupperを文字列 '$ 1'(何もしません)を実行するように指示してから、それを置換文字列としてALLマッチで使用するようにpreg_replace_callbackに切り替える必要があると考えています製。これは入力とまったく同じ出力を与えます。

代わりにこれを試してみてください:

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

@David Stocktonの解説と同じ理由で+1します。ありがとうございました!私が与えたように、P – AndyPerlitch

+0

PSは、実際に私が持っているパターンはだけなので、私はああ、ええ、私は本当に笑正規表現を見ていなかったが、私は今のことを見 – AndyPerlitch

+0

ucfirstを必要としなかったアンダースコアと最初の文字をキャプチャ彼に受け入れても、これは非常に有益な答えでした。ありがとう! – Brian

1

の下にあなたがいくつか良い答えがあるこれまでに投稿されたers。

[更新]編集したコードより簡潔であることを切り取ら:しかし、私はちょうど蹴りのためのバリエーションを投稿しようと思いました

<?php 

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

上記のコードは次のように考えて:

  1. Unicode文字は文字列の一部である可能性があります。その場合には、'UTF-8'は安全エンコードする必要があります:

  2. mb_convert_case混在する場合で来る言葉の世話をMB_CASE_TITLEフラグを使用して、私たちは言葉と考えられている「_」手動で正規化し、する必要はありません。境界。

  3. mb_convert_case機能は、参考のため4.3.0

PHP Sourceので、PHPのバージョンで動作します。