PHP - добавить подчеркивание перед заглавными буквами - PullRequest
19 голосов
/ 03 июня 2011

Как заменить набор слов, которые выглядят так:

SomeText

до

Some_Text

Ответы [ 5 ]

35 голосов
/ 03 июня 2011

Этого легко достичь с помощью регулярного выражения:

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

краткое объяснение регулярного выражения:

  • \ B устанавливает положение на границе слова.
  • [A-Z] соответствует любым заглавным буквам из A-Z.
  • () оборачивает совпадение обратным ссылочным номером 1.

Затем мы заменяем на '_ $ 1', что означает замену совпадения на [подчеркивание + обратная ссылка 1]

9 голосов
/ 03 июня 2011
$s1 = "ThisIsATest";
$s2 = preg_replace("/(?<=[a-zA-Z])(?=[A-Z])/", "_", $s1);

echo $s2;  //  "This_Is_A_Test"

Пояснение:

Регулярное выражение использует два уточняющих утверждения (одно оглядывающееся назад и одно заглядывающее вперед), чтобы найти точки в строке, в которые следует вставить подчеркивание.

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

Первое утверждение гарантирует, что в начале строки не вставлено подчеркивание.

4 голосов
/ 03 июня 2011

Самый простой способ сделать это - заменить регулярное выражение.

Например:

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

Вызывание substr для удаления ведущего '_'

3 голосов
/ 15 марта 2013

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

Преобразование:

HelloKittyOlolo
Declaration
CrabCoreForefer
TestTest
testTest

В:

hello_kitty_ololo
declaration
crab_core_forefer
test_test
test_test
3 голосов
/ 03 июня 2011
<?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

?>
...