2012-03-26 38 views

回答

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 2012-03-26 20:09:49

+1

這不是關於誰先回答問題,而是回答問題是否好。/e修飾符不是一個好主意。這可能是危險的,現在已經被棄用,並且會在某個時候從PHP中完全刪除。 – 2012-03-26 21:06:53

+0

@Josh Davis我做了一些Google搜索,對於安全問題你絕對正確。當我接受霍華德的回答時,我沒有看到他和戴維之間有明顯的優勢。感謝您指出了這一點。 – AndyPerlitch 2012-03-29 22:53:57

1

嘗試在正則表達式中添加字母「e」(意思是eval)作爲修飾符。

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

太棒了。你忘記的一件事是把單引號放在\\ 1附近。試圖編輯,因此拒絕...試圖接受你的答案,所以說我可以在4分鐘後。這些措施是新的嗎? – AndyPerlitch 2012-03-26 20:04:58

+0

我認爲\\ 1需要引用該工作。 – 2012-03-26 20:07:19

+0

它可以在我的php測試環境中使用雙引號。 – Howard 2012-03-26 20:09:22

1

我想你想ucfirst不是strtoupper。這將只利用每場比賽的第一個字母,而不是像strtoupper那樣的整個比賽。我也在考慮你需要切換到preg_replace_callback,因爲你當前的語法是告訴php在字符串'$ 1'(它什麼都不做)上運行strtoupper,然後把它作爲替換字符串傳遞給所有匹配製作。這會給你輸入完全相同的輸出。

試試這個:

<?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的原因與評論@David Stockton的答案相同。謝謝! – AndyPerlitch 2012-03-26 20:10:33

+0

ps實際上我只捕獲下劃線和第一個字母的模式,所以我不需要ucfirst – AndyPerlitch 2012-03-26 20:11:34

+0

啊是的,我沒有真正看看正則表達式大聲笑,但我現在看到:P – Brian 2012-03-26 20:17:22

1

你有一些很好的答案已經發布到目前爲止;然而,我想我只是後的變化爲踢:

[更新]編輯的代碼剪斷更簡潔:

<?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需要與混合的情況下進來的話護理標誌,所以我們並不需要手動校準和「_」被認爲是一個字boundry。

  3. mb_convert_case功能可與PHP版本,因爲4.3.0

PHP Source以供參考。

相關問題