23

次のような一連の単語を置き換えるにはどうすればよいですか。

SomeText

Some_Text

?

4

5 に答える 5

39

これは、正規表現を使用して簡単に実現できます。

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

正規表現の簡単な説明:

  • \B は、単語境界で位置をアサートします。
  • [AZ] は、AZ の大文字に一致します。
  • () は、後方参照番号 1 で一致をラップします。

次に、一致を [アンダースコア + 後方参照 1] に置き換えることを意味する '_$1' に置き換えます。

于 2011-06-03T12:29:59.090 に答える
10
$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

最初のアサーションは、文字列の先頭にアンダースコアが挿入されていないことを確認します。

于 2011-06-03T12:29:25.970 に答える
4

これを行う最も簡単な方法は、正規表現の置換を使用することです。

例えば:

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

そこにあるsubstr呼び出しは、先頭の「_」を削除するためのものです

于 2011-06-03T12:35:21.867 に答える
3

$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
于 2013-03-15T12:53:16.187 に答える
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

?>
于 2011-06-03T12:35:59.817 に答える