Php 如何在限定大写字母后插入句点?

Php 如何在限定大写字母后插入句点?,php,regex,preg-replace,Php,Regex,Preg Replace,根据以下规则,我如何在任何大写字母后插入句点,而这些字母后面没有大写字母: 它后面是一个空格;或 后跟另一个大写字母;或 它是字符串中的最后一个字母,前面有空格或大写字母 输入/输出示例: Patrick TJ Stephens成为Patrick T.J.Stephens TJ斯蒂芬斯变成T.J.斯蒂芬斯 TJ Stephens QC变成T.J.Stephens Q.C. Marissa C.J.Gilbert变成Marissa C.J.Gilbert Marissa C.Gilbert变成Ma

根据以下规则,我如何在任何大写字母后插入句点,而这些字母后面没有大写字母:

  • 它后面是一个空格;或
  • 后跟另一个大写字母;或
  • 它是字符串中的最后一个字母,前面有空格或大写字母
  • 输入/输出示例:

    Patrick TJ Stephens
    成为
    Patrick T.J.Stephens

    TJ斯蒂芬斯
    变成
    T.J.斯蒂芬斯

    TJ Stephens QC
    变成
    T.J.Stephens Q.C.

    Marissa C.J.Gilbert
    变成
    Marissa C.J.Gilbert

    Marissa C.Gilbert
    变成
    Marissa C.Gilbert

    C玛丽莎·吉尔伯特
    变成
    C玛丽莎·吉尔伯特

    Marissa Gilbert C
    变成
    Marissa Gilbert C.

    我一直在使用:

    $str = preg_replace( '/([A-Z])(?=\s|$)/', '\1.', $str );
    
    不幸的是,它将
    Patrick TJ Stephens
    变成了
    Patrick TJ。Stephens
    代替Patrick T.J.Stephens

    您可以使用:

    $str = preg_replace('/[A-Z](?![a-z.])\K/', '.', $str);
    
    不确定它是否遵循你的规则,但它确实起作用


    或者使用这个:
    [A-Z](?![^A-Z\s])\K
    翻译您的所有需求将需要一个前向和后向,因为这个正则表达式:

    $str = preg_replace('/(?<=[\hA-Z])[A-Z]$|[A-Z](?=[\hA-Z])/m', '$0.', $str);
    

    $str=preg_replace(“/”(?和一个假人版本,由假人me:)

    以下是将“Patrick TJ Stephens”变成“Patrick T.J Stephens”的

    ,在“J”之后没有句号。
      $str = preg_replace(
            array(
                   '/([A-Z])(?=\s|$)/',
                   '/([A-Z])([A-Z])/'
            ),
            array(
                   '\1.',
                   '\1.\2'
            ),
      $str );