如何用正则表达式用短划线和小写替换所有大写字母?

时间:2014-04-03 22:08:39

标签: php regex

如何用php中的破折号和小写等效替换所有大写字母?

例如understandRegexBetterunderstand-regex-better

我的Google-fu和以下代码的实验并没有让我走得太远。

echo preg_replace('/[A-Z]+/', "-$'", "understandRegexBetter");

编辑: 我忘了特别声明第一个字符永远不会大写。

5 个答案:

答案 0 :(得分:6)

首选方法:

此方法替换任何一组大写字母,前面是带有-的小写字母和大写字母集。然后我们在事实之后小写整个字符串。

echo strtolower(preg_replace(
    '/(?<=[a-z])([A-Z]+)/',
    '-$1',
    'understandRegexBetter'
));

RegEx回调:

使用preg_replace_callback()替换任意一组大写字母,后跟-后面的字母strtolower()。但是,这将在您的字符串中留下前面的-(我们可以在RegEx中查找前面的字符,但是您的第一个字母将保留为大写字母)。

echo preg_replace_callback(
    '/[A-Z]+/',
    function ($matches) {
        $character = reset($matches);
        return '-' . strtolower($character);
    },
    'understandRegexBetter'
);

<强>推荐使用:

旁注,您可以在技术上将preg_replace()e modifier一起使用,但自PHP 5.5起不推荐使用。一个例子是:

echo preg_replace(
    '/([A-Z]+)/e',
    '"-" . strtolower("$1")',
    'understandRegexBetter'
);

答案 1 :(得分:4)

你可以这样做:

echo strtolower(preg_replace('~(?=[A-Z])(?!\A)~', '-', $str));

答案 2 :(得分:2)

您可以使用:

$s = 'understandRegexBetter';
$r = preg_replace_callback('~(?<=[a-z])([A-Z])~',
    function ($m) { return '-' . strtolower($m[1]); }, $s);
echo $r;

答案 3 :(得分:1)

试试这个:

echo  strtolower(preg_replace('/([A-Z]+)/', "-$1", "understandRegexBetter"));

答案 4 :(得分:1)

您可以尝试这样的事情(e标志意味着评估):

echo preg_replace('/([A-Z])/e', "strtolower('-\\1')", "understandRegexBetter");