次のような一連の単語を置き換えるにはどうすればよいですか。
SomeText
に
Some_Text
?
これは、正規表現を使用して簡単に実現できます。
$result = preg_replace('/\B([A-Z])/', '_$1', $subject);
正規表現の簡単な説明:
次に、一致を [アンダースコア + 後方参照 1] に置き換えることを意味する '_$1' に置き換えます。
$s1 = "ThisIsATest";
$s2 = preg_replace("/(?<=[a-zA-Z])(?=[A-Z])/", "_", $s1);
echo $s2; // "This_Is_A_Test"
説明:
正規表現は、2 つのルックアラウンド アサーション (1 つは後読み、もう 1 つは先読み) を使用して、アンダースコアを挿入する必要がある文字列内のスポットを見つけます。
(?<=[a-zA-Z]) # a position that is preceded by an ASCII letter
(?=[A-Z]) # a position that is followed by an uppercase ASCII letter
最初のアサーションは、文字列の先頭にアンダースコアが挿入されていないことを確認します。
これを行う最も簡単な方法は、正規表現の置換を使用することです。
例えば:
substr(preg_replace('/([A-Z])/', '_$1', 'SomeText'),1);
そこにあるsubstr呼び出しは、先頭の「_」を削除するためのものです
$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
<?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
?>