如何在php中将所有大写字母替换为短划线和相应的小写字母?
例如,将understandRegexBetter
替换为understand-regex-better
?
我的谷歌搜索和以下代码的实验并没有让我走得很远。
echo preg_replace('/[A-Z]+/', "-$'", "understandRegexBetter");
编辑: 我忘了明确说明第一个字符永远不会是大写字母。
echo strtolower(preg_replace('~(?=[A-Z])(?!\A)~', '-', $str));
\A
。 - undefined\A
是字符串的开头锚点,但在多行模式下与^
不同,它保持不变。 - undefinedm
修饰符,否则以后可能会让我头疼不已。 - undefined首选方法:
此方法将在小写字母前面的任何大写字母集合替换为 -
和该大写字母集合。然后我们在事后将整个字符串转换为小写字母。
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'
);
您可以使用:
$s = 'understandRegexBetter';
$r = preg_replace_callback('~(?<=[a-z])([A-Z])~',
function ($m) { return '-' . strtolower($m[1]); }, $s);
echo $r;
ThisCase
的。 - undefined-
和strtolower(letters)
。 - undefined试一下这个:
echo strtolower(preg_replace('/([A-Z]+)/', "-$1", "understandRegexBetter"));
TestString
(-test-string
) 上会失败。虽然看起来好像OP没有特别要求。 - undefinedecho preg_replace('/([A-Z])/e', "strtolower('-\\1')", "understandRegexBetter");
e
修饰符,应该使用 preg_replace_callback()
替代。 - undefined