2012-03-26 15 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以供参考。

相关问题