Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何转换包含大写字符的字符串_Php_String - Fatal编程技术网

PHP:如何转换包含大写字符的字符串

PHP:如何转换包含大写字符的字符串,php,string,Php,String,我正在处理类名,我需要检查是否有任何大写名称,并按如下方式将其拆分: "UserManagement" becomes "user-management" 或 经过广泛的搜索,我只找到了ucfirst、strtolower、strtoupper、ucword的各种用法,我看不出如何使用它们来满足我的需要。有什么想法吗 感谢阅读;) 最好的方法可能是preg_replace,使用一种模式将大写字母替换为小写字母,并在其前面添加“-” 您还可以遍历每个字母并重新生成整个字符串。您可以使用正则

我正在处理类名,我需要检查是否有任何大写名称,并按如下方式将其拆分:

 "UserManagement" becomes "user-management"  

经过广泛的搜索,我只找到了ucfirst、strtolower、strtoupper、ucword的各种用法,我看不出如何使用它们来满足我的需要。有什么想法吗


感谢阅读;)

最好的方法可能是preg_replace,使用一种模式将大写字母替换为小写字母,并在其前面添加“-”


您还可以遍历每个字母并重新生成整个字符串。

您可以使用正则表达式获取每个单词,然后添加破折号,如下所示:

preg_match_all ('/[A-Z][a-z]+/', $className, $matches); // get each camelCase words
$newName = strtolower(implode('-', $matches[0])); // add the dashes and lowercase the result

没有内在的方法可以做到这一点

这将
将此
转换为
将此
转换为:

$str = preg_replace('/([a-z])([A-Z])/', '$1-$2', $str);
$str = strtolower($str);
您可以使用以小写字母后跟大写字母的任何实例替换为小写破折号小写变体:

$dashedName = preg_replace('/([^A-Z-])([A-Z])/', '$1-$2', $className);
然后后跟a以处理所有剩余的大写字母:

return strtolower($dashedName);
此处的完整功能:

function camel2dashed($className) {
  return strtolower(preg_replace('/([^A-Z-])([A-Z])/', '$1-$2', $className));
}

要解释所使用的正则表达式,请执行以下操作:

/        Opening delimiter
(        Start Capture Group 1
  [^A-Z-]   Character Class: Any character NOT an uppercase letter and not a dash
)        End Capture Group 1
(        Start Capture Group 2
  [A-Z]    Character Class: Any uppercase letter
)        End Capture Group 2
/        Closing delimiter
至于替换字符串

$1  Insert Capture Group 1
-   Literal: dash
$2  Insert Capture Group 2

这只是在没有任何捕获组的情况下完成的——只需在大写字母(不包括字符串的第一个字母)之前找到零宽度位置,然后用连字符替换它,然后在新字符串上调用strtolower

代码:()

前瞻
(?=…)
进行匹配,但不使用任何字符

试试这些:
$1  Insert Capture Group 1
-   Literal: dash
$2  Insert Capture Group 2
echo strtolower(preg_replace('~(?!^)(?=[A-Z])~', '-', $string));