将点分隔的字符串中的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 . ']';
}
答案 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;