powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обратный эскипированный разбор без спец.символов
25 сообщений из 34, страница 1 из 2
Обратный эскипированный разбор без спец.символов
    #38338863
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у нас есть список, в котором разделителем является запятая

Код: plaintext
1.
a, b, c, ....



Но вдруг у нас один из айтемов содержит запятую и как мы понимаем она может нам поломать десерию (анпак)

Код: plaintext
1.
b = 1, 2



Итого поломка

Код: plaintext
1.
a, 1, 2, c, ...



Такие поломки обычно решаются эскипированием.

Код: plaintext
1.
a, 1,, 2, c, ...



и перед разбором мы заменяем разночтение на безопасную комбинацию

Код: plaintext
1.
list = replace(commaSplit(replace("a, 1,, 2, c, ...", ",," => "protectorUnique")), "protectorUnique" => ",")



Пока все ок.
Идем дальше

Код: plaintext
1.
1 = у, ф



Итого поломка

Код: plaintext
1.
a, у, ф,, 2, c, ...



Как в этом случае провести эскипацию для n-вложенности чтобы
1) потом можно было разобрать рекурсивно
2) не использовать спец.символов
3) критерий рекурсивности (признак, флаг) был бы в самом формате и тоже был бы без спец.символов


Под спец.символами понимаются символы, которых невозможно набрать с клавиатуры простым нажатием, а можно задать только через хекс-код например. Что-то типа 0x05 Такие символы по условию задачи использовать нельзя.

В итоге последний пример должен распарситься в

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
0 => a
1 => 
    0=> 
        0 => у 
        1 => ф
    1 => 2
2 => c
3 => ...
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38342143
ALKIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

a, b, c, ...

(b = 1,2 -> 1,,2
(1 = у,ф -> у,,ф)
= у,,ф,,2
)

= a, у,,ф,,2, c, ...
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38342339
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALKIR= a, у,,ф,,2, c, ...

Это после парсинга превращается в такое

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
0 => a
1 => 
    0 => у 
    1 => ф
    2 => 2
2 => c
3 => ...



А по условию задачи должно в такое

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
0 => a
1 => 
    0=> 
        0 => у 
        1 => ф
    1 => 2
2 => c
3 => ...
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38342553
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
= a, у,,,,ф,,2, c, ...
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38342583
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?= a, у,,,,ф,,2, c, ...

А как такие штучки разбирать алгоритмически. Ладно мы тут видим, что два уровня вложенности, а ведь в буфер, который мы получаем мы там не видим. Я пока не могу придумать как произвести разбор "с низов", а как такое распарсить идя "сверху" пока придумать не могу.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346124
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

Может я конечно суть вопроса не понял, но...
Разве такой вариант не подойдёт? - определяемся с символом для эскэйпирования (например обратный слэш). Определяемся с критерием вложенности (например повышепие уровня символ "<", а понижение - ">"). При сериализации массива эскэйпируем данные символы и получаем однозначный результат простой для обратного преобразования (например "а, б, <<1, 2>, \<input\>>, д").

Может не в тему, но если я правильно понял, то я бы делал именно так. Кстати, разумеется символ \ тоже эскэйпируем так \\.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346142
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?= a, у,,,,ф,,2, c, ...

Опять же, если верно понял задачу, то такой вариант не подходит. Представим, что у нас есть 2 списка (многомерных):
Код: php
1.
2.
3.
4.
5.
6.
7.
0 => а
1 =>
   0 =>
      0 => у
      1 => ф
   1 => 2
2 => c


и
Код: php
1.
2.
3.
4.
5.
0 => а
1 =>
   0 => у,,ф
   1 => 2
2 => c



оба списка будут преобразованы в ту же строку "a, у,,,,ф,,2, c", а это уже не верно (так как мы не будем знать какой вариант верный).
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346167
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и сам парсер к моему варианту (хотя думаю и лучше можно написать... на быструю руку набросал. на php):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function parse(&$arr, &$str, $start = 0){
  $el = 0;
  $arr[$el]="";
  while ($start<count($str)){
    switch($str[$start]){
      case "/" : $arr[$el] .= $str[++$start]; break;
      case "," : $arr[++$el]=""; break;
      case "<" : $arr[$el] = array(); $start = parse($arr[$el], $str, ++$start); break;
      case ">" : return $start; break;
      default  : $arr[$el] .= $str[$start];
    }
    $start++;
  }
  return $start;
}

$arr = array();
$str=str_split("x,<1,input/, textarea and button>,y,z"); //что бы с кодировками не заморачиваться бьём в массив
parse($arr, $str);
var_dump($arr);


Кстати, тут экранирующий символ "/".
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346183
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, есть общие правила к примеру по работе с Comma-Separated Values

Вот фрагмент примера CSV из Википедии.

Код: html
1.
2.
3.
4.
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00



Алгоритм сохранения CSV такой. Каждый field (item) перед тем как положить в СSV
проверяется на наличе внутри сплиттера (это запятая в данном примере). Если сплиттер есть
то айтем закрывается в кавычки. Если внутри айтема
есть кавычки то они удваиваются.

При парсинге - Наобророт. Убираем дубликаты кавычек. И берём филды
атомами там где есть левая и правая кавычка.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346184
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недостаток такого способа таков что если мы внутри одного айтема
СSV кладём другой CSV-файл (я видел и такие извращения) то объём
текста многократно растёт. А если эту операцию повторить рекурсивно
то мы раздуем текст до терабайтов. Впрочем той-же болезнью болеет
и XML. Если внутрть Value-of тега пихать другой XML то происходит
враппинг с еще большими потерями free-space на диске.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346327
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonто происходит
враппинг с еще большими потерями free-space на диске.

Да, это и есть суть задачи, которая лежит в основе этой темы.

Насколько корректно утверждать, что единственным спасителем фриспейса в условиях сильнейшей рекурсивной вложенности вместо маркера-разделителя порций является только хедер с маркером длины порции?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346328
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько корректно утверждать, что не существует методов эскипации, устойчивой к рекурсивной вложенности формата без увеличения объема по методу сложных процентов?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346341
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

HDLC битстаффинг рассматривал?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346348
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLumix,

HDLC битстаффинг рассматривал?

Не могу сообразить как битстаффинг замутить на буквах, чтобы руками было удобно печатать.

Код: plaintext
1.
1,1 => 1,(1,1) => 1,1,,1 => 1,1,,(1,1) => 1,1,,1,,,1 => 1,(1,1),,1,,,1 => 1,1,,1,,1,,,1 => err



Или бутстафферы предлагают использовать в качестве нуля точку, а в качестве единицы запятую?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346355
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрхотя думаю и лучше можно написать...



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// таблица замен
, => @zpt
( => @obr
) => @cbr

// наращивание сетки

1@zpt @obr1@cbr, 2@zpt @obr2@cbr 
   => 1@zpt @obr1@cbr, (1@zpt @obr1@cbr, 2@zpt @obr2@cbr)
   => 1@zpt @obr1@cbr, ((1@zpt @obr1@cbr, 2@zpt @obr2@cbr), 2@zpt @obr2@cbr)

// резульат парсинга

0 => 1, (1) 
   0 =>
      0 => 1, (1)
      1 => 2, (2)
   1 => 2, (2)



1) можно ли такой формат распарсить попилом или регулярником или он разбирается только рекурсивно (с помощью стека)?
2) что делать с наличием @zpt, @obr, @cbr в исходных реальных данных? Запрещать, вырезать или тоже эскипировать? Ведь так можно эскипироваться до бесконечности...
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346358
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixИзопропилLumix,

HDLC битстаффинг рассматривал?

Не могу сообразить как битстаффинг замутить на буквах, чтобы руками было удобно печатать.

Код: plaintext
1.
1,1 => 1,(1,1) => 1,1,,1 => 1,1,,(1,1) => 1,1,,1,,,1 => 1,(1,1),,1,,,1 => 1,1,,1,,1,,,1 => err



Или бутстафферы предлагают использовать в качестве нуля точку, а в качестве единицы запятую?

Неправильно. Как тебе уже сказали выше разделители удваиваются на каждый уровнь вложения.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346368
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПрограмёрхотя думаю и лучше можно написать...



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// таблица замен
, => @zpt
( => @obr
) => @cbr

// наращивание сетки

1@zpt @obr1@cbr, 2@zpt @obr2@cbr 
   => 1@zpt @obr1@cbr, (1@zpt @obr1@cbr, 2@zpt @obr2@cbr)
   => 1@zpt @obr1@cbr, ((1@zpt @obr1@cbr, 2@zpt @obr2@cbr), 2@zpt @obr2@cbr)

// резульат парсинга

0 => 1, (1) 
   0 =>
      0 => 1, (1)
      1 => 2, (2)
   1 => 2, (2)



1) можно ли такой формат распарсить попилом или регулярником или он разбирается только рекурсивно (с помощью стека)?
2) что делать с наличием @zpt, @obr, @cbr в исходных реальных данных? Запрещать, вырезать или тоже эскипировать? Ведь так можно эскипироваться до бесконечности...

по поводу исходника (примера), я не понял что это :). То есть, я понял, что это что-то основанное на моём сообщении, но вот для чего эта таблица замен была введена и эти замены использованы - не понял.

по пунктам:
1. Я пробовал что-то подобное без рекурсии сделать, но не получилось
2. Как уже написал, просто не понял сути. Поясните пожалуйста. в моём случае это смотрелось бы так (если использовать ваш синтаксис, но вместо замен использовать экранирование): 1\, \(1\),((1\, \(1\),2\, \(2\)),2\, \(2\))
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346380
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр(если использовать ваш синтаксис, но вместо замен использовать экранирование): 1\, \(1\),((1\, \(1\),2\, \(2\)),2\, \(2\))

Вы просто работаете вот на такой таблице замен

Код: plaintext
1.
2.
3.
4.
// таблица замен
, => \,
( => \(
) => \)



Подобный стиль эскипирования плох тем, что нахер убивает глаза того, кто будет читать такой формат глазами. Я например очень сильно с трудом замечаю, где у вас запятая эскипирована, а где нет. При обработке вашего формата вручную очень и очень легко ошибиться просто поставив бекслеш не перед той скобкой.


ПрограмёрЯ пробовал что-то подобное без рекурсии сделать, но не получилось

Понятно.

Я жду, что может быть кто-нибудь посоветует какой-то ленточный формат, допускающий распарсивания в дерево без рекурсии.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346387
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПрограмёр(если использовать ваш синтаксис, но вместо замен использовать экранирование): 1\, \(1\),((1\, \(1\),2\, \(2\)),2\, \(2\))

Вы просто работаете вот на такой таблице замен

Код: plaintext
1.
2.
3.
4.
// таблица замен
, => \,
( => \(
) => \)



Подобный стиль эскипирования плох тем, что нахер убивает глаза того, кто будет читать такой формат глазами. Я например очень сильно с трудом замечаю, где у вас запятая эскипирована, а где нет. При обработке вашего формата вручную очень и очень легко ошибиться просто поставив бекслеш не перед той скобкой.

Теперь понял. То что для чтения человеком неудобно - это да. Но исключает описанную Вами проблему. Просто таблица замен немного больше, чем Вы описали:
Код: plaintext
1.
2.
3.
4.
5.
// таблица замен
, => \,
( => \(
) => \)
\ => \\


то есть достаточно экранировать 4 символа и всё.

LumixПрограмёрЯ пробовал что-то подобное без рекурсии сделать, но не получилось

Понятно.

Я жду, что может быть кто-нибудь посоветует какой-то ленточный формат, допускающий распарсивания в дерево без рекурсии.

Не думаю что вообще распарсивание в дерево возможно без рекурсии. Хотя авось кто придумает...
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346405
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ^^-последовательности, есть триграфы языка це.
Задача-то какая? Что во что надо завернуть, если слегка перефразировать профессора Преображенского?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346470
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЗадача-то какая?

Ленточная сериализация сетей только с помощью гуманоидных символов и безрекурсионный алгоритм распарсивания этой ленты.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346471
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр
Код: plaintext
1.
2.
3.
4.
5.
// таблица замен
, => \,
( => \(
) => \)
\ => \\


то есть достаточно экранировать 4 символа и всё.


Подскажите как по вашей модели экранировать

Код: plaintext
1.
"x,<1,input/, textarea and button>,y,z"



если
Код: plaintext
1.
$input = "x,<1,$input/, textarea and button>,y,z"
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346502
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПрограмёр
Код: plaintext
1.
2.
3.
4.
5.
// таблица замен
, => \,
( => \(
) => \)
\ => \\


то есть достаточно экранировать 4 символа и всё.


Подскажите как по вашей модели экранировать

Код: plaintext
1.
"x,<1,input/, textarea and button>,y,z"



если
Код: plaintext
1.
$input = "x,<1,$input/, textarea and button>,y,z"



Извините, не понял что требуется. просто экранировать данную строку для записи её как элемента (или части элемента) списка? Если да, тогда давайте определимся всё же, что символ экранирования лучше использовать "/", что бы не дублировать его в строках (ведь \ уже является символом экранирования в строках). Тогда:
Код: php
1.
2.
3.
4.
5.
function escape_str($str){
  return str_replace(array('/', ',', '<', '>'), array('//', '/,', '/<', '/>'), $str);
}

$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z"



на выходе получим:
Код: php
1.
$input = "x,<1,x/,/<1/,///, textarea and button/>/,y/,z/, textarea and button>,y,z"
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346512
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, у тебя дефект постановки. У тебя вообще не список с разделителями.
У тебя должно быть 100% дерево. Тогда твои детские болезни сразу пройдут.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346550
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonLumix, у тебя дефект постановки.

Странный термин "дефект постановки". Я не пойму о чем речь. Это какое-то личное оскорбление что ли?
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обратный эскипированный разбор без спец.символов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]