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"

解释:

正则表达式使用两个环视断言(一个后视和一个前瞻)来查找字符串中应该插入下划线的位置。

(?<=[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
<?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 回答
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 回答