如何使用正则表达式将所有大写字母替换为破折号并将小写字母替换为?

3

如何在php中将所有大写字母替换为短划线和相应的小写字母?

例如,将understandRegexBetter替换为understand-regex-better

我的谷歌搜索和以下代码的实验并没有让我走得很远。

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

编辑: 我忘了明确说明第一个字符永远不会是大写字母。


你不能进行两次替换的原因是什么? - undefined
5个回答

9
您可以这样做:
echo strtolower(preg_replace('~(?=[A-Z])(?!\A)~', '-', $str));

我真的很喜欢这个解决方案,之前不知道\A - undefined
@Sam:\A是字符串的开头锚点,但在多行模式下与^不同,它保持不变。 - undefined
1
@HamZa:在写这个答案之前,我也以一种奇怪的方式迷失了自己。 - undefined
是的,谷歌告诉了我。很高兴知道如何使用m修饰符,否则以后可能会让我头疼不已。 - undefined

8

首选方法:

此方法将在小写字母前面的任何大写字母集合替换为 - 和该大写字母集合。然后我们在事后将整个字符串转换为小写字母。

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'
);

不推荐使用:

顺便提一下,虽然你可以在PHP 5.5中使用 preg_replace()e修饰符,但这是被不推荐使用的。一个例子如下:

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

2

您可以使用:

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

是的,我知道,我要删除它。其他答案更好 :) - undefined
1
不要,你的答案是唯一一个考虑到ThisCase的。 - undefined
是的,实际上我刚意识到其他答案没有检查驼峰命名法。 - undefined
OP并没有真正要求这个,他要求将大写字母直接替换为-strtolower(letters) - undefined
1
@Sam:即使OP没有问,我们也可以假设。这是一个通用的任务,所以我们都知道它是必需的。 - undefined
显示剩余2条评论

2

试一下这个:

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

1
只是提前告诉你,这个在TestString(-test-string) 上会失败。虽然看起来好像OP没有特别要求。 - undefined

1
您可以尝试类似以下的代码(e标志表示求值):
echo preg_replace('/([A-Z])/e', "strtolower('-\\1')", "understandRegexBetter");

3
"'e'在新版PHP中已被弃用并移除。" - undefined
-1 不要使用已弃用的 e 修饰符,应该使用 preg_replace_callback() 替代。 - undefined
2
好的,我承认我没有跟上规格。这段代码是我凭记忆写的,很久没用过了,只是突然想起来。谢谢你的建议。 - undefined

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