2010-11-14 45 views
0

我有小问题。我试图通过用ucword替换所有大写字词

Hello World What 

替换句话即

HELLO World WHAT 

到目前为止有办法检测它:

preg_replace('/(\b[A-Z][A-Z]+\b)/sm','$1', $string); 

但不起任何作用,因为我不能把作为一个参数ucwords('$ 1')。

任何帮助将是伟大的。

欢呼声, /马辛

附: 这种方法并不好:ucwords(strtolower($ string));因为我想要保留所有并非全部上限的东西。

回答

2

它会更有效使用匿名函数,而再上/e修改来电。

$formatted = preg_replace_callback(
     '/(\b[A-Z][A-Z]+\b)/', 
     create_function(
      '$matches', 
      'return ucwords(strtolower($matches[0]));' 
     ), 
     $string 
    ); 
+0

效率更高? – Marcin 2010-11-14 11:54:36

+0

替换字符串本质上被传递到PHP的每个替换,而不是回调方法,它只需要传递一次。 – 2010-11-14 11:57:08

+0

不错,我发布了其他的正则表达式问题,你能帮助吗:http://stackoverflow.com/questions/4177374/detecting-and-replacing-merged-words-myword-to-my-word-php-regex - 欢呼声 – Marcin 2010-11-14 12:03:51

2

如何使用:

ucwords(strtolower($string)); 

您可以用e修改这种方法结合起来:

preg_replace('/(\b[A-Z][A-Z]+\b)/sme','ucwords(strtolower($1))', $string); 
+0

这是没有办法的办法作为财产以后什么不是全部大写应该保持原样,但修改为使用正则表达式感谢 – Marcin 2010-11-14 11:40:35

+0

- 现在应该仅在全部大写工作。 – 2010-11-14 11:44:53

+0

但是,您没有在该行代码中使用'/ e'修饰符? – 2010-11-14 11:45:13