php - 在跳过缩写的同时将驼峰大小写格式化为可读的 PHP

标签 php regex camelcasing

所以我被卡住了 - 我在这里看了很多答案,但似乎没有一个能解决我的最后一个问题。

通过带有 JSON 的 API,我收到驼峰格式的设备列表。我无法改变这一点。

我需要将这个驼峰命名法翻译成普通语言 -

到目前为止,我已经通过以下方式将大部分单词分开:

$string = "SomeEquipmentHere";

$spaced = preg_replace('/([A-Z])/', ' $1', $string);
var_dump($spaced);

string ' Some Equipment Here' (length=20)

$trimmed = trim($spaced);
var_dump($trimmed);
string 'Some Equipment Here' (length=19)

哪个工作正常 - 但在某些设备中包含缩写

“ABSBrakes”——这需要 ABS 并与制动器分离

我无法检查彼此相邻的几个大写字母,因为它会将 ABS 和 Brakes 放在一起 - 还有更多类似的,即:“CDRadio”

所以想要的是输出:

"ABS Brakes"

有没有办法格式化它,如果大写字母彼此相邻,则只在该序列的最后一个大写字母前添加一个空格?

我不擅长正则表达式。

编辑

这两个贡献都很棒 - 稍后来到这里的人应该阅读这两个答案

最后要解决的问题是以下模式:

“服务正常”变为“服务正常”

“ESP”变成“ESP”

仅由纯大写缩写组成的模式由计算小写字母的函数固定,如果没有,它将跳过 preg_replace()。

但正如 Flying 在对他的回答的评论中所写,他的正则表达式可能没有涵盖很多实例,并且答案可能是不可能的 - 我不知道这是否对正则表达式构成挑战。

可能通过添加一些“如果大写后面没有小写,则不应插入空格”的规则

最佳答案

这是一个在替换字符串中不使用任何 anchor 、捕获组或引用的单一调用模式:/(?:[a-z]|[A-Z]+)\K(?=[ A-Z]|\d+)/

Pattern&Replace Demo

代码:(Demo)

$tests = [
    'SomeEquipmentHere',
    'ABSBrakes',
    'CDRadio',
    'Valve14',
];
foreach ($tests as $test) {
    echo preg_replace('/(?:[a-z]|[A-Z]+)\K(?=[A-Z]|\d+)/',' ',$test),"\n";
}

输出:

Some Equipment Here
ABS Brakes
CD Radio
Valve 14

这是一个更好的方法,因为没有什么可擦掉的。如果有新的字符串需要考虑(破坏我的方法),请将它们留在评论中,以便我可以更新我的模式。

图案说明:

/         #start the pattern
(?:[a-z]  #match 1 lowercase letter
|         #or
[A-Z]+)   #1 or more uppercase letters
\K        #restart the fullstring match (forget the past)
(?=[A-Z]  #look-ahead for 1 uppercase letter
|         #or
\d+)      #1 or more digits
/         #end the pattern

编辑:

还有一些其他模式可以提供更好的准确性,包括:

/(?:[a-z]|\B[A-Z]+)\K(?=[A-Z]\B|\d+)/

当然,上述模式将无法正确处理 ServiceOK

Demo Link Word Boundaries Link


或者这个带有 anchor 的模式:

/(?!^)(?=[A-Z][a-z]+|(?<=\D)\d)/

以上模式会准确拆分:SomeEquipmentHere, ABSBrakes, CDRadio, Valve14, ServiceOK , ESP 根据 OP 的要求。

Demo Link

*注意:随着提供更多示例字符串,可以提高模式准确性。

关于php - 在跳过缩写的同时将驼峰大小写格式化为可读的 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47430861/

相关文章:

css - 在 CSS id 或类中使用 camelCase 是否可以?

php - CakePHP 中的模型验证

javascript - 为什么在 Javascript 中正则表达式字符串没有封装在引号中?

regex - 客户端验证不支持使用 Unicode 的 ASP.NET MVC 正则表达式验证

javascript - 如何将 kebab-case 转换为 PascalCase?

c# - JSON序列化中属性名称的默认驼峰式大小写

php - MySQL 在哪里获取表信息

php - 从 MySQL 获取时在 json 中获取额外的值

php - Doctrine ORM 2 选择负数

c# - 表单验证只允许英文字母字符