powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обратный эскипированный разбор без спец.символов
34 сообщений из 34, показаны все 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
Обратный эскипированный разбор без спец.символов
    #38346551
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрна выходе получим:
Код: php
1.
$input = "x,<1,x/,/<1/,///, textarea and button/>/,y/,z/, textarea and button>,y,z"



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

И ещё я попытался её разобрать вашим же алгоритмом. Он рекурсивно не стал ничего разбирать, а обработал только один шаг рекурсии.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$input = "";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";

print_r($input);


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();
parse($arr, str_split($input));
print_r($arr);




Вывод работы (разрывы в строчках для форума я поставил сам)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,x///////////////,///////////////
<1///////////////,///////////////////////////////, textarea and button///////////////>
///////////////,y///////////////,z///////////////, textarea and button///////>
///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
/,y/,z/, textarea and button>,y,zArray
(
    [0] => x
    [1] => Array
        (
            [0] => 1
            [1] => x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,///////////////, textarea and button///////>
                      ///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
                      /,y/,z/, textarea and button>,y,z, textarea and button
        )

    [2] => y
    [3] => z
)



PS. Кстати, в HTML используется экипирование с операторами

Код: html
1.
<![CDATA[<sender>John Smith</sender>]]>



Будет заменено на

Код: html
1.
&lt;sender&gt;John Smith&lt;/sender&gt;
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346555
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПрограмёрна выходе получим:
Код: php
1.
$input = "x,<1,x/,/<1/,///, textarea and button/>/,y/,z/, textarea and button>,y,z"



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

И ещё я попытался её разобрать вашим же алгоритмом. Он рекурсивно не стал ничего разбирать, а обработал только один шаг рекурсии.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$input = "";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";

print_r($input);


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();
parse($arr, str_split($input));
print_r($arr);




Вывод работы (разрывы в строчках для форума я поставил сам)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,x///////////////,///////////////
<1///////////////,///////////////////////////////, textarea and button///////////////>
///////////////,y///////////////,z///////////////, textarea and button///////>
///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
/,y/,z/, textarea and button>,y,zArray
(
    [0] => x
    [1] => Array
        (
            [0] => 1
            [1] => x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,///////////////, textarea and button///////>
                      ///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
                      /,y/,z/, textarea and button>,y,z, textarea and button
        )

    [2] => y
    [3] => z
)




Ну так всё правильно вывел. Что написали, то и вывело :). Мы для того и экранировали символы, что бы то, что является строковым элементом не воспринималось как новый уровень или как несколько элементов (при наличии запятой).

Вы что хотите сделать? Если покажите в виде массива, что хотите загнать в строку (и хотите получить обратно), а на реальном примере Вам покажу как работает данный алгоритм. Тут просто кто-то кого-то не понял (или Вы меня, или как говорил, я задачу, хотя по Вашим рассуждениям думаю что понял правильно).
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346715
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЛенточная сериализация сетей только с помощью гуманоидных символов и безрекурсионный алгоритм распарсивания этой ленты.Нифига не понял, чем не устроили четыре спецсимвола: начало группы, разделитель, конец группы и экранирующий символ?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346720
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернусь в начало.

Дан список

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



Представим его как S-выражение с небольшими изменениями. Без конструктора list и квоты.

Код: sql
1.
(a, b, c, ....)



Пришло b которое по сути тоже список (1,2)

Вставляем его так

Код: sql
1.
(a, (1,2), c, ....)



Если пришло b которое является не списком а строковым литералом то так
уж и быть оставим его строкой.

Код: sql
1.
(a, "1,2", c, ....)



Ситуацию когда внутри СТРОКИ b должна сидеть другая СТРОКА с - выкинем нахер.
Таких постановок не бывает. Строка - это суть - атом в контексте задачи разработки.
И в нее НЕ предусмотрено впихивать или инкапсулировать другие такие-же строки.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346762
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovLumixЛенточная сериализация сетей только с помощью гуманоидных символов и безрекурсионный алгоритм распарсивания этой ленты.Нифига не понял, чем не устроили четыре спецсимвола: начало группы, разделитель, конец группы и экранирующий символ?

Не устроило тем, что вот этот результат плохо поддается ручной обработке, а это всего 5 уровней вложенности, а что будет если из будет 100.

Код: plaintext
1.
2.
3.
4.
5.
x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,x///////////////,///////////////
<1///////////////,///////////////////////////////, textarea and button///////////////>
///////////////,y///////////////,z///////////////, textarea and button///////>
///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
/,y/,z/, textarea and button>,y,z



Если использовать ручной текстовый набор, то предполагается, что с этим будет работать человек. А если у нас получается формат, который человека убивает, то какой смысл тогда работать с эскипированием.

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

Код: sql
1.
(a, "1,2", c, ....)



Ситуацию когда внутри СТРОКИ b должна сидеть другая СТРОКА с - выкинем нахер.
Таких постановок не бывает. Строка - это суть - атом в контексте задачи разработки.
И в нее НЕ предусмотрено впихивать или инкапсулировать другие такие-же строки.

В строку можно вставлять другую строку, более, того ваше же решение его и позволяет делать, достаточно просто эскипировать символ (флаг) контектста!

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

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

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

Код: plaintext
1.
(a, ((у, ф,), 2), c, ...) => (1, ((2, 3,), 4), 5, ...) // это адреса в таблице первого прохода



В принципе должно получиться очень круто.
Завтра опробуем.
mayton, пока предварительно огромное спасибо за разжевывание своей суперской идеи.
И сорри, что с первого раза не дошло. :-)
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346796
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да незачто.

Я собственно идею только щас изложил. Мой первый пост - то просто цитата с википедии. С пояснением.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38347815
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixНе устроило тем, что вот этот результат плохо поддается ручной обработке, а это всего 5 уровней вложенности, а что будет если из будет 100Тоже мне, попугай Кеша: "А если дождь во время усушки?!"
В качестве специальных используются относительно редкоиспользуемые символы.
Автор TeX-а выбрал { и } для ограничителей группы. Что вам мешает сделать тоже самое?
Есть вариант с двойной и одинарной кавычкой, которые выбираются так, чтобы внутри не было окаймляющего символа.
Есть "Объединение"'БезПробела' (или 'Объединение' || "БезПробела"), есть 'объединение' "с пробелом" ( REXX ) - прекрасно читается после минимальной практики и легко пишется хоть руками, хоть автоматом.
Есть классический сишный вариант: "Строка с \" кавычкой внутри". Точно так же легко читается и пишется.
Есть SMTP-экранирование - данные начинаются с новой строки после команды DATA. Заканчиваются строкой из одной точки. Если в тексте есть строка из одной точки - она удваивается. Если при чтении данных мы видим строку, которая начинается с точки и содержит более одного символа - эта точка убирается.
Есть, в конце-концов MIME (пять RFC c 2045 по 2049 ).
Полезно изучить text/plain Format=Flowed - позволяет, например, складывать длинные строки сохраняя цитирование.

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


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