умный способ условно разбить эту строку? - PullRequest
0 голосов
/ 28 мая 2010

У меня есть строка, которая может быть в одной из двух форм:

prefix=key=value (which could have any characters, including '=')

или

key=value

Так что мне нужно разделить его либо по первому, либо по второму знаку равенства, основываясь на логическом значении, которое устанавливается в другом месте. Я делаю это:

if ($split_on_second) {
    $parts = explode('=', $str, 3);
    $key = $parts[0] . '=' . $parts[1];
    $val = $parts[2];
} else {
    $parts = explode('=', $str, 2);
    $key = $parts[0];
    $val = $parts[1];
}

Который должен работать, но чувствует себя не изящным. Есть лучшие идеи в php? (Я полагаю, есть способ сделать это с помощью регулярных выражений, но я не являюсь ниндзя с регулярными выражениями.; -)

Ответы [ 3 ]

5 голосов
/ 28 мая 2010

Edit:

Теперь я замечаю, что вы получаете "если префикс должен быть там или нет" откуда-то еще, и в этом случае мое оригинальное решение, вероятно, немного менее элегантно. Вместо этого я бы предложил что-то вроде этого:

$parts = explode('=', $str);
$key = array_shift($parts);
if($has_prefix) {
    $key .= '=' . array_shift($parts);
}
$val = implode('=', $parts);

.

Мой оригинальный ответ:

$parts = array_reverse(explode('=', $str));
$val = array_shift($parts);
$key = implode('=', array_reverse($parts));
2 голосов
/ 28 мая 2010

как насчет

$parts = explode('=', $str);
$key = array_shift( $parts);
//additionally, shift off the second part of the key
if($split_on_second)
{
    $key = $key . '=' . array_shift($parts);
}
//recombine any accidentally split parts of the value.
$val = implode($parts, "=");

Еще один вариант

$explodeLimit = 2;
if($split_on_second)
{
    $explodeLimit++;
}
$parts = explode('=', $str, $explodeLimit);
//the val is what's left at the end
$val = array_pop($parts);
//recombine a split key if necessary
$key = implode($parts, "=");

И еще не проверял это, но, похоже, это может быть одна из тех забавных оптимизаций, которые делают код точным, но нечитаемым ...

$explodeLimit = 2;
//when split_on_second is true, it bumps the value up to 3
$parts = explode('=', $str, $explodeLimit + $split_on_second );
//the val is what's left at the end
$val = array_pop($parts);
//recombine a split key if necessary
$key = implode($parts, "=");
1 голос
/ 28 мая 2010
if ($prefix_exists) {
    list($prefix, $str) = explode('=', $str, 2);
    $prefix .= '=';
}

list($key, $val) = explode('=', $str, 2);
$key = $prefix . $key;
...