woonem
@woonem

Как использовать экранирование при explode?

Допустим, есть такая строка:
type\:text:content\:some_data
Образуется она так:
$in[]='type:text';
$in[]='content:some_data';
for($i=0; isset($in[$i]); $i++){
 $in[$i]=str_replace(array('\', ':'), array('\\', '\:'), $in[$i]);
}
$string=implode(':', $in); //$string=='type\:text:content\:some_data'

Нужно разбить строку по разделителю ":", учитывая экранирование.
explode() разобьёт строку так:
1. type\
2. text
3. content\
4. some_data
а надо
1. type:text
2. content:some_data

Как это сделать?
  • Вопрос задан
  • 355 просмотров
Решения вопроса 1
woonem
@woonem Автор вопроса
ru.stackoverflow.com/questions/208329/%D0%A0%D0%B0...

function custom_split($str) {
    $parts = preg_split('/(?<![^\\\\]\\\\):/', $str);
    array_walk($parts, function(&$v) { $v = str_replace('\\:', ':', $v); });

    return $parts;
}

var_dump(custom_split('a:b:c:d\\:h:g'));
var_dump(custom_split('a:b:c:d\\\\:h:g'));

> array (size=5)
>   0 => string 'a' (length=1)
>   1 => string 'b' (length=1)
>   2 => string 'c' (length=1)
>   3 => string 'd:h' (length=3)
>   4 => string 'g' (length=1)
> array (size=6)
>   0 => string 'a' (length=1)
>   1 => string 'b' (length=1)
>   2 => string 'c' (length=1)
>   3 => string 'd\\' (length=3)
>   4 => string 'h' (length=1)
>   5 => string 'g' (length=1)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@GreatRash
Почему не разбить по "\:" ?
Ответ написан
miraage
@miraage
Дальше пляшите сами.

$input = 'type\:text:content\:some_data';
$output = preg_split('/(?<!\\\\):/', $input);

var_dump($output);

array(2) {
  [0] =>
  string(10) "type\:text"
  [1] =>
  string(18) "content\:some_data"
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы