How can I replace a set of words that look like:
SomeText
to
Some_Text
?
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]
$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.
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 '_'
<?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
?>
$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
来源:https://stackoverflow.com/questions/6227061/php-add-underscores-before-capital-letters