How can I replace a set of words that look like:
SomeText
to
Some_Text
?
<?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
?>
$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.
$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
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 '_'
This can easily be achieved using a regular expression:
$result = preg_replace('/\B([A-Z])/', '_$1', $subject);
a brief explanation of the regex:
Then we replace with '_$1' which means replace the match with an [underscore + backreference 1]