作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个正则表达式
(?<=\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('--', '', $word) 会更容易吗?
最佳答案
要一步完成这一切,您可以使用
preg_replace('/(?<=[a-zA-Z])(?:([A-Z])|[_\h])/', '-\1', $string);
参见demo here .
这个想法是捕获第一个捕获组中的大写字母,如果匹配 _
或 \h
(水平空白),则该捕获组将为空。
您的问题是 \w
代表 [a-zA-Z_]
,因此后面的外观也匹配 _
。
关于php - 我如何将这场比赛限制为一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24223402/
我是一名优秀的程序员,十分优秀!