是否可以使用regexp将“x.y.z”转换为“x [y] [z]”?

What is the most efficient pattern to replace dots in dot-separated string to an array-like string e.g x.y.z -> x[y][z]

Here is my current code, but I guess there should be a shorter method using regexp.

function convert($input)
{
  if (strpos($input, '.') === false) {
    return $input;
  }
  $input = str_replace_first('.', '[', $input);
  $input = str_replace('.', '][', $input);

  return $input . ']';

}

In your particular case "an array-like string" can be easily obtained using preg_replace function:

$input = "x.d.dsaf.d2.d";
print_r(preg_replace("/\.([^.]+)/", "[$1]", $input));  // "x[d][dsaf][d2][d]"

From what I can understand from your question; "x.y.z" is a String and so should "x[y][z]" be, right? If that is the case, you may want to give the following code snippet a try:

        <?php           
            $dotSeparatedString = "x.y.z";
            $arrayLikeString    = "";
            //HERE IS THE REGEX YOU ASKED FOR...
            $arrayLikeString    = str_replace(".", "", preg_replace("#(\.[a-z0-9]*[^.])#", "[$1]", $dotSeparatedString));

            var_dump($arrayLikeString);     //DUMPS: 'x[y][z]' 

Hope it helps you, though....

Using a fairly simple preg_replace_callback() that simply returns a different replacement for the first occurrence of . compared to the other occurrences.

$in = "x.y.z";

function cb($matches) {
    static $first = true;
    if (!$first) 
        return '][';
    $first = false;
    return '[';
}

$out = preg_replace_callback('/(\.)/', 'cb', $in) . ((strpos('.', $in) !== false) ? ']' : ']');
var_dump($out);

The ternary append is to handle the case of no . to replace

already answered but you could simply explode on the period delimiter then reconstruct a string.

$in = 'x.y.z';

$array = explode('.', $in);

$out = '';

foreach ($array as $key => $part){
    $out .= ($key) ? '[' . $part . ']' : $part;
}

echo $out;