如何用php中的破折号和小写等效替换所有大写字母?
例如understandRegexBetter
到understand-regex-better
?
我的Google-fu和以下代码的实验并没有让我走得太远。
echo preg_replace('/[A-Z]+/', "-$'", "understandRegexBetter");
编辑: 我忘了特别声明第一个字符永远不会大写。
答案 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");