PHP - add underscores before capital letters

前端 未结 5 2295
梦如初夏
梦如初夏 2021-02-18 14:48

How can I replace a set of words that look like:

SomeText

to

Some_Text

?

相关标签:
5条回答
  • 2021-02-18 15:18
    <?php 
    
    $string = "SomeTestString";
    $list = split(",",substr(preg_replace("/([A-Z])/",',\\1',$string),1));
    $text = "";
    
    foreach ($list as $value) {
        $text .= $value."_";
    }
    
    echo substr($text,0,-1); // remove the extra "_" at the end of the string
    
    ?>
    
    0 讨论(0)
  • 2021-02-18 15:22
    $s1 = "ThisIsATest";
    $s2 = preg_replace("/(?<=[a-zA-Z])(?=[A-Z])/", "_", $s1);
    
    echo $s2;  //  "This_Is_A_Test"
    

    Explanation:

    The regex uses two look-around assertions (one look-behind and one look-ahead) to find spots in the string where an underscore should be inserted.

    (?<=[a-zA-Z])   # a position that is preceded by an ASCII letter
    (?=[A-Z])       # a position that is followed by an uppercase ASCII letter
    

    The first assertion makes sure that no underscore is inserted at the start of the string.

    0 讨论(0)
  • 2021-02-18 15:25

    $result = strtolower(preg_replace('/(.)([A-Z])/', '$1_$2', $subject));

    Converts:

    HelloKittyOlolo
    Declaration
    CrabCoreForefer
    TestTest
    testTest
    

    To:

    hello_kitty_ololo
    declaration
    crab_core_forefer
    test_test
    test_test
    
    0 讨论(0)
  • 2021-02-18 15:36

    The simplest way to do this is with a regular expression replacement.

    For example:

    substr(preg_replace('/([A-Z])/', '_$1', 'SomeText'),1);
    

    The substr call there is to remove a leading '_'

    0 讨论(0)
  • 2021-02-18 15:38

    This can easily be achieved using a regular expression:

    $result = preg_replace('/\B([A-Z])/', '_$1', $subject);
    

    a brief explanation of the regex:

    • \B asserts position at a word boundary.
    • [A-Z] matches any uppercase characters from A-Z.
    • () wraps the match in a back reference number 1.

    Then we replace with '_$1' which means replace the match with an [underscore + backreference 1]

    0 讨论(0)
提交回复
热议问题