PHP、正则表达式和大写字母

4
我需要大写我的正则表达式所捕获/匹配的内容。比如说,如果我想要将连字符后面的第一个字符大写,我的正则表达式会像这样:
-(.)
我的替换字符串会像这样:
-\U1
在 preg_replace 中,我会有类似于这样的代码: $string = preg_replace('/-(.)/', '-\1', $string);
但是这在 preg_replace 中不起作用(我认为它不支持更改反向引用中的大小写)。有什么建议吗?

4
你可以使用preg_replace_callback()实现这个功能。 - Barmar
1
为了强调@Barmar的评论“5.5.0 /e修饰符已被弃用。请改用preg_replace_callback()。” - ficuscr
2个回答

4
您可以像这样使用preg_replace_callback
  $string = preg_replace_callback(
           '#(?<=-)(.)#',
           create_function(
               '$matches',
               'return strtoupper($matches[1]);'
           ),
           $string
       );

或者,使用匿名函数(PHP版本 >= 5.3.0):

$string = preg_replace_callback( '#(?<=-)(.)#', function( $matches) {
    return strtoupper( $matches[1]);
}, $string);

实时演示:http://ideone.com/IpoCvB


2
@nickb:感谢您的编辑,不过应该提到匿名函数仅在 PHP 5.3.0 之后才可用。 - anubhava
1
是的,但5.3版本自2009年6月以来已经发布了将近4年。如果您的主机现在仍不支持5.3版本,那么是时候考虑更换更好的主机了。 - nickb

0

$string = preg_replace('/(?<=-)(.)/e', 'strtoupper("$1")', $string);

e modifier


3
自 PHP 5.5.0 版本起,e 修饰符已被标记为过时。强烈建议不要再使用该功能。 - HamZa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接