在PHP中,使冒号小写的每个字母都不使用explode,implode

时间:2009-12-10 15:49:23

标签: php regex preg-replace

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

实施例

的x示例-HEADER:测试 变 的x例如报头:测试

的y例如:testoneTWOthree 变 的y例如:testoneTWOthree

4 个答案:

答案 0 :(得分: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);

来自Pattern Modifiers

  

e (PREG_REPLACE_EVAL)

     

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

     

只有preg_replace()使用此功能   改性剂;其他PCRE会忽略它   功能

然而,我会回避eval()字符串,特别是当与用户输入结合使用时,它可能是非常危险的做法。我希望preg_replace_callback()方法作为一般规则。

答案 1 :(得分:3)

您可以查看preg_replace_callback

答案 2 :(得分:3)

当给予e modifier时,可以在正则表达式模式上使用preg_replace(请查看该页面上的示例#4),以便在替换时调用PHP代码: / p>

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

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

答案 3 :(得分:2)

$str = 'y-exaMPLE:testoneTWOthree';
function lower( $str ) {
    return strtolower( $str[1] );
}

echo preg_replace_callback( '~^([^:]+)~', 'lower', $str );