是否有可能转换" x.y.z"到" x [y] [z]"使用正则表达式?

时间:2016-05-08 12:25:59

标签: php regex pcre

将点分隔的字符串中的dots替换为类似数组的字符串,例如x.y.z -> x[y][z]

,效率最高的模式是什么?

这是我当前的代码,但我想使用regexp应该有一个更短的方法。

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

  return $input . ']';

}

4 个答案:

答案 0 :(得分:5)

在您的特定情况下" 类似数组的字符串"可以使用preg_replace函数轻松获得:

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

答案 1 :(得分:0)

从我的问题中我可以理解; " x.y.z" 是一个字符串,所以" x [y] [z]" 是吧,对吧? 如果是这种情况,您可能需要尝试以下代码段:

        <?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]' 

希望它能帮到你,不过......

答案 2 :(得分:0)

使用一个相当简单的preg_replace_callback(),它只会为第一次出现的.与其他事件相比返回一个不同的替换。

$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);

三元附加是处理无.替换

的情况

答案 3 :(得分:0)

已经回答,但您可以简单地在句点分隔符上爆炸,然后重新构建一个字符串。

$in = 'x.y.z';

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

$out = '';

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

echo $out;