如何用间距替换所有大写字母?

时间:2010-01-10 10:44:31

标签: php regex

$string = "MaryGoesToSchool";

$expectedoutput = "Mary Goes To School";

4 个答案:

答案 0 :(得分:20)

这样的事情:

$string = "MaryGoesToSchool";

$spaced = preg_replace('/([A-Z])/', ' $1', $string);
var_dump($spaced);

这:

  • 匹配大写字母
  • 并用空格替换每一个,以及匹配的内容


这给出了这个输出:

string ' Mary Goes To School' (length=20)


然后你可以使用:

$trimmed = trim($spaced);
var_dump($trimmed);

要删除开头的空格,可以获得:

string 'Mary Goes To School' (length=19)

答案 1 :(得分:6)

试试这个:

$expectedoutput = preg_replace('/(\p{Ll})(\p{Lu})/u', '\1 \2', $string);

\p{…}符号通过Unicode character properties描述字符; \p{Ll}表示小写字母,\p{Lu}表示大写字母。

另一种方法是:

$expectedoutput = preg_replace('/\p{Lu}(?<=\p{L}\p{Lu})/u', ' \0', $string);

这里每个大写字母前面只有一个空格,如果它前面有另一个字母。所以MaryHasACat也可以。

答案 2 :(得分:1)

这是一个非正则表达式解决方案,我用它来将camelCase字符串格式化为更易读的格式:

<?php
function formatCamelCase( $string ) {
        $output = "";
        foreach( str_split( $string ) as $char ) {
                strtoupper( $char ) == $char and $output and $output .= " ";
                $output .= $char;
        }
        return $output;
}

echo formatCamelCase("MaryGoesToSchool"); // Mary Goes To School
echo formatCamelCase("MaryHasACat"); // Mary Has A Cat
?>

答案 3 :(得分:0)

尝试:

$string = 'MaryGoesToSchool';
$nStr = preg_replace_callback('/[A-Z]/', function($matches){
    return $matches[0] = ' ' . ucfirst($matches[0]);
}, $string);
echo trim($nStr);