【问题标题】:How to add space in PHP string only between full CamelCase words skipping single uppercase letters intact? [duplicate]如何仅在完整的 CamelCase 单词之间添加 PHP 字符串中的空格,完整地跳过单个大写字母? [复制]
【发布时间】:2019-11-08 11:16:30
【问题描述】:

我需要在这样的字符串中添加空格:
IMACSuperSeriousLabelDCN

输出如下:

IMAC Super Serious Label DCN

目前我已经设法在 PHP 中使用此代码:

$label = preg_replace('/(?<!\ )[A-Z]/', ' $0', $field);

但是它不考虑跳过单个大写字母,所以我得到:
I M A C Super Serious Label D C N

如何跳过在大写字母之间插入空格,但在大写字母之前放置一个空格,然后是小写字母,以及在小写字母出现几个大写字母之后(示例字符串的结尾?

【问题讨论】:

  • 所以,您找到了this solution,但它不适合您。
  • 仅供参考:使用正则表达式,很难处理像IA 这样的单字母大写单词(例如IMACASuperSeriousLabelDCN => IMAC A Super Serious Label DCN
  • 我检查了链接,是的,我一直在使用它,但是我的案例比答案中显示的更先进。幸运的是,我不应该有你发布的带有 A 和 I 字母的情况:)
  • 参见 this regex 基于编辑的链接解决方案。该线程的另一个解决方案是also working

标签: php regex string


【解决方案1】:

一种方法是检查每个大写字符的前一个字符是小写,还是下一个字符是小写,如果是,则预先插入一个空格:

$field = "IMACSuperSeriousLabelDCN";
$label = preg_replace('/(?<=[a-z])[A-Z]|[A-Z](?=[a-z])/', ' $0', $field);
echo $label . "\n";

输出:

IMAC Super Serious Label DCN

Demo on 3v4l.org

【讨论】:

    【解决方案2】:

    一个选项可以使用 2 个捕获组和一个 alternation 使用 branch reset group 共享相同的捕获组

    (?|([A-Z])([A-Z][a-z])|([a-z])([A-Z]))
    
    • (?|分支重置组
      • ([A-Z])捕获组1,匹配A-Z
      • ([A-Z][a-z])捕获组2
      • |或者
      • ([a-z])捕获组1,匹配a-z
      • ([A-Z])捕获组2,匹配A-Z
    • )关闭分支重置组

    Regex demo

    在替换使用中

    $1 $2
    

    输出

    IMAC Super Serious Label DCN
    

    【讨论】:

    • 你用 PHP 混淆了一个通常的环视解决方案 - (?&lt;=[A-Z])(?=[A-Z][a-z])|(?&lt;=[a-z])(?=[A-Z]) :)
    • @WiktorStribiżew 啊哈,你是对的......:) 你应该发布它。
    • @WiktorStribiżew 这也有效,并且仍然使用“$0”作为替换!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多