jos*_*erk 35

这可以使用正则表达式轻松实现:

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

正则表达式的简要说明:

  • \ B在字边界处断言位置.
  • [AZ]匹配AZ中的任何大写字符.
  • ()将匹配包装在后面的参考号1中.

然后我们用'_ $ 1'代替,这意味着用[下划线+后引用1]替换匹配


Tom*_*lak 9

$s1 = "ThisIsATest";
$s2 = preg_replace("/(?<=[a-zA-Z])(?=[A-Z])/", "_", $s1);

echo $s2;  //  "This_Is_A_Test"
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

第一个断言确保在字符串的开头没有插入下划线.