PHP - add underscores before capital letters
Asked Answered
J

5

24

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

SomeText

to

Some_Text

?

Joan answered 3/6, 2011 at 12:24 Comment(1)
(related) exploding-uppercasedcamelcase-to-upper-cased-camel-case-in-phpPascia
B
41

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]

Brooksbrookshire answered 3/6, 2011 at 12:29 Comment(4)
You probably would only be able to tell which one is faster by means of benchmarking your solution. The difference would probably be minute. The operations get slower as the regex grows more complicated.Brooksbrookshire
This one avoids lookahead and look-behind assertions, which in my opinion makes it faster. Also it is more readable. Just means insert underscore before capital letter that comes after non-word-boundary.Bernettabernette
But it gives Some_Text and Some_Other_Text and s_O_M_Em_O_R_Et_E_X_T for SomeText and SomeOtherText and sOMEmOREtEXT. Are you OK with it?Nictitate
Ok, nice try - what if the string is "ILovePHPAndXMLSoMuсh" and the result is: I_Love_P_H_P_And_X_M_L_So_Much, but I need PHP and XML?Hootchykootchy
T
11
$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.

Teaspoon answered 3/6, 2011 at 12:29 Comment(0)
H
4

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 '_'

Herlindaherm answered 3/6, 2011 at 12:35 Comment(0)
G
4

$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
Geof answered 15/3, 2013 at 12:53 Comment(0)
Z
3
<?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

?>
Zoogloea answered 3/6, 2011 at 12:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.