如何使preg_替换捕获大写字母(php)?

如何使preg_替换捕获大写字母(php)?,php,string,preg-replace,Php,String,Preg Replace,我有一个字符串:“Some_string_to_capitalize”,我想将其转换为“Some_string_to_capitalize”。我试过: $result = preg_replace( '/(_([a-z]{1}))/' , strtoupper('$1') , $subject ) 及 我查看了php手册页和此处,但没有发现任何内容。道歉,如果这是一个dup .尝试添加字母“e”(意思是eval)作为正则表达式的修饰符 $result = preg_replace("/(_(

我有一个字符串:“Some_string_to_capitalize”,我想将其转换为“Some_string_to_capitalize”。我试过:

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

我查看了php手册页和此处,但没有发现任何内容。道歉,如果这是一个dup

.

尝试添加字母“e”(意思是eval)作为正则表达式的修饰符

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

我想你首先要的是UC而不是Strtouper。这将只大写每个匹配的第一个字母,而不是像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
);
?>

我想您应该使用
preg\u replace\u 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

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

太棒了。您忘记的一件事是在\\1周围加上单引号。试图编辑,因此被拒绝。。。我试着接受你的回答,4分钟后我说可以。这些度量值是新的吗?如果您打开不带引号的通知,您将看到PHP每次遇到匹配时都会发出通知:注意:使用未定义的常量\u t-假定的“\u t”……我相信David是正确的。我收到了同样的“未定义常量”信息。答案的替换部分应编辑为
“strtoupper('\\1')”
,作为旁注,无论何时使用e regex修饰符和用户提供的字符串,请务必小心。它可以用来执行任意命令。这意味着他们可以潜在地访问数据库、删除文件等。使用preg_replace_回调函数更安全……+1 Howard先回答了,所以我给了他一个接受的答案,但这也是一个非常有用的答案。谢谢问题不在于谁先回答,而在于答案是否正确。/e修饰符不是一个好主意。它可能很危险,现在已经被弃用,将来某个时候会从PHP中完全删除。@Josh Davis我在谷歌上搜索了一下,你对安全问题的看法是绝对正确的。在我接受霍华德的回答时,我没有看到他和大卫之间有任何明显的优势。感谢您指出这一点。+1原因与对@David Stockton答案的评论相同。非常感谢。ps实际上我的模式只捕获了下划线和第一个字母,所以我不需要ucfirstAh是的,我没有真正看正则表达式lol,但我现在看到了:P
function toUpper($matches) {
    return strtoupper($matches[0]);
}

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

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