如何将此匹配限制为一个字符

des*_*key 2 php regex preg-match

我有一个正则表达式

(?<=\w)([A-Z]|_|\s)
Run Code Online (Sandbox Code Playgroud)

这正确匹配以下内容

ModelName  (matches N)
modelName  (matches N)
Model Name (matches space)
model name (matches space)
model_name (matches underscore)
Run Code Online (Sandbox Code Playgroud)

但以下是不正确的

Model_Name (matches underscore and N)
Run Code Online (Sandbox Code Playgroud)

在后者中,我只需匹配空格,但在之前的所有结果中都具有相同的正则表达式匹配.

我有点生疏,所以有谁知道如何最好地实现这一目标?

我的背景如下:

/**
 * 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)));
}
Run Code Online (Sandbox Code Playgroud)

最后一次失败的匹配将使此函数返回model--name.

在返回之前再做另一个str_replace(' - ','',$ word)会更容易吗?

Rob*_*bin 6

要一步完成就可以使用

preg_replace('/(?<=[a-zA-Z])(?:([A-Z])|[_\h])/', '-\1', $string);
Run Code Online (Sandbox Code Playgroud)

在这里演示.

我们的想法是捕获第一个捕获组中的大写字母,如果匹配a _\h(水平空白),则该组将为空.

你的问题就是\w代表[a-zA-Z_],所以背后的外观也很匹配_.