我有一个正则表达式
(?<=\w)([A-Z]|_|\s)
正确匹配以下内容
ModelName (matches N)
modelName (matches N)
Model Name (matches space)
model name (matches space)
model_name (matches underscore)
但以下内容不正确
Model_Name (matches underscore and N)
在后者中,我只需匹配空格,但在之前的所有结果中都有相同的正则表达式匹配。
我有点生疏,所以有谁知道如何最好地实现这个目标?
我的背景如下:
/**
* Converts 'ModelName', 'modelName' and 'model_name' to 'model-name'
* @param string $word
* @return string
*/
public static function hyphenate($word)
{
return strtolower(str_replace([' ', '_'], '', preg_replace('!(?<=\\w)([A-Z]|_|\\s)!', '-$1', $word)));
}
最后一次失败的匹配将使此函数返回model--name
。
在返回之前再做一个str_replace(&#39; - &#39;,&#39;&#39;,$ word)会更容易吗?
答案 0 :(得分:6)
要一步完成,您可以使用
preg_replace('/(?<=[a-zA-Z])(?:([A-Z])|[_\h])/', '-\1', $string);
请参阅demo here。
我们的想法是捕获第一个捕获组中的大写字母,如果匹配_
或\h
(水平空白),则该组将为空。
您的问题是\w
代表[a-zA-Z_]
,因此背后的匹配也会与_
匹配。