0

这可以用正则表达式完成吗?

例子

x-example-HEADER:teSt 变成 x-example-header:teSt

y-exaMPLE:testoneTWOthree 变成 y-example:testoneTWOthree

4

4 回答 4

4

使用preg_replace_callback()

$output = preg_replace_callback('![a-zA-Z]+:!', 'to_lower', $input);

function to_lower($matches) {
  return strtolower($matches[0]);
}

除非在特定情况下,否则您不能使用正则表达式进行大小写转换(例如,可以将 'A' 替换为 'a')。

编辑:好的,你每天都会学到一些新东西。你可以这样做:

$output = preg_replace('![a-zA-Z]+:!e', "strtoupper('\\1')", $input);

模式修饰符

e (PREG_REPLACE_EVAL)

如果设置了此修饰符, preg_replace()会正常替换替换字符串中的反向引用,将其评估为 PHP 代码,并使用结果替换搜索字符串。单引号、双引号、反斜杠 () 和 NULL 字符将被替换反向引用中的反斜杠转义。

只有preg_replace()使用这个修饰符;它被其他 PCRE 函数忽略。

但是,我会回避 eval()ing 字符串,尤其是在与用户输入结合使用时,这可能是一种非常危险的做法。preg_replace_callback()作为一般规则,我更喜欢这种方法。

于 2009-12-10T15:57:23.053 回答
3

你可以看看preg_replace_callback

于 2009-12-10T15:53:58.320 回答
3

您可以在正则表达式模式上使用e修饰符preg_replace(查看该页面上的示例 #4),以便调用 PHP 代码作为替换的一部分:

$string = "x-example-HEADER:teSt";
$new_string = preg_replace('/(^.+)(?=:)/e', "strtolower('\\1')", $string);
// => x-example-header:teSt

该模式会将第一个冒号之前的所有内容抓取到第一个反向引用中,然后用strtolower函数替换它。

于 2009-12-10T15:58:46.793 回答
2
$str = 'y-exaMPLE:testoneTWOthree';
function lower( $str ) {
    return strtolower( $str[1] );
}

echo preg_replace_callback( '~^([^:]+)~', 'lower', $str );
于 2009-12-10T16:00:26.713 回答