2010-04-14 49 views
14

我的名字是這樣的:的preg_replace以大寫字母報價後

$str = 'JAMES "JIMMY" SMITH' 

我跑strtolower,然後ucwords,返回此:

$proper_str = 'James "jimmy" Smith' 

我想利用第二第一個字母是雙引號的字母。這是正則表達式。它似乎strtoupper不工作 - 正則表達式只是返回未更改的原始表達式。

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

任何線索?謝謝!!

+0

你期待什麼輸出? – codaddict 2010-04-14 14:52:45

回答

20

使用e modifier有替代評估:

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

$0包含整個模式的匹配,所以"以及小寫字母。但這並不重要,因爲通過strtoupper發送時"不會改變。

+0

像一個魅力一樣工作,謝謝 – Summer 2010-04-14 14:51:43

+0

我覺得我比它更需要作爲strtoupper(''')==='「'''';-) – Gumbo 2010-04-14 14:53:56

+20

顯然'e'選項是一個嚴重的安全漏洞,他們建議使用'preg_replace_callback()'來代替。僅供參考。 – 2012-09-26 22:16:00

31

可能做到這一點的最好辦法是使用:

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

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

可以使用e(EVAL)標誌上preg_replace()但我一般建議反對。特別是在處理外部輸入時,這可能是非常危險的。

+0

我得到一個錯誤,'上'不是一個有效的回調。當我用'strtoupper'替換'upper'時,我得到了'ARRAY'而不是大寫字母'J' – Summer 2010-04-14 15:09:43

+0

@Summer然後你沒有根據我的代碼片段定義'upper()'函數。 – cletus 2010-04-14 16:10:54

+0

你是多麼的正確。謝謝。 – Summer 2010-04-14 17:14:16

0

像這樣的事情可能做的伎倆:

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

我這樣做沒有正則表達式,爲我的自定義功能ucwords()的一部分。假設不超過兩個引號出現在字符串中

$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

使用preg_replace_callback - 但你不需要添加額外的命名函數,而可以使用匿名函數。

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

/e用途是被棄用的PHP 5.5和PHP中7不起作用

0

你應該這樣做:

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

您should'nt使用「的eval() 「出於安全原因。

無論如何,模式修飾符「e」已棄用。 參見:PHP Documentation

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

ucwords()具有第二分隔符參數,可選的分隔符包含單詞分隔符。使用空格''和"作爲分隔符,並且「吉米」將被正確識別。