Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> парсинг шаблона с вложениями 
:(
    Опции темы
svip
Дата 31.12.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



Есть строка:
Код
{{качественные |красивые }барные стойки|мебель для ресторанов} {| в Москве| в городе Москва| в ассортименте}{| недорого| дешево| доступно| выгодно}


и подобные. нужно получить:
Код

Мебель для ресторанов в Москве
Красивые барные стойки в Москве дешево
Мебель для ресторанов в городе Москва недорого
Качественные барные стойки в Москве дешево
Красивые барные стойки недорого
Мебель для ресторанов
Красивые барные стойки в Москве выгодно
Красивые барные стойки выгодно
Качественные барные стойки в городе Москва
Качественные барные стойки в городе Москва дешево
Качественные барные стойки в Москве доступно
Качественные барные стойки в городе Москва выгодно
Качественные барные стойки недорого
Мебель для ресторанов в городе Москва
Мебель для ресторанов в городе Москва выгодно
Красивые барные стойки в Москве доступно
Красивые барные стойки в городе Москва выгодно


Вложенность скобок должна быть неограничена.

Подскажите какой использовать алгоритм, или может уже есть готовые методы реализации?
Думаю нужно рекурсией выбирать все что между {}, составлять для каждого массив, затем составлять массив для значений разделенных | потом перебирать все эти массивы и собирать предложения.
Может как то по другому возможно?
PM MAIL WWW ICQ   Вверх
taral
Дата 1.1.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Попробуй заменить | и { в строке таким образом чтобы строка приняла вид JSON. а потом json_decode переведешь все в массив.
Ну а дальше думаю знаешь что делать=)
Я не вникал в строку. Возможно будет проще реализовать это по другому. Но мне кажется этот способ самым простым.
PM MAIL   Вверх
svip
Дата 1.1.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



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

Пробовал разобрать сначало на 
Код

1){качественные |красивые }барные стойки|мебель для ресторанов
2)в Москве| в городе Москва| в ассортименте
3)| недорого| дешево| доступно| выгодно


потом нужно разобрать 
Код
{качественные |красивые }барные стойки|мебель для ресторанов

на 
Код

1) качественные барные стойки
2) красивые барные стойки
3) мебель для ресторанов


и получить массив вида
Код

$m[1][1]="качественные барные стойки"
$m[1][2]="красивые барные стойки"
$m[1][3]="мебель для ресторанов"


и далее вторую строку: 
Код
в Москве| в городе Москва| в ассортименте


Код

$m[2][1]="в Москве"
$m[2][2]="в городе Москва"
$m[2][3]="в ассортименте"


и тд.

вот проблема в первой строке, как ее разобрать, то что в фигурных скобках
Думаю нужно сначало разделить на 
Код

1) {качественные|красивые }барные стойки
2) мебель для ресторанов


но вот как разобрать? как не учитывать | стоящие в фигурных скобках.

Люди помогите,  smile 


PM MAIL WWW ICQ   Вверх
taral
Дата 1.1.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



У меня не возникало проблем с json. Переводишь текст в UTF-8.
делаешь замену.
| на ", "
делаешь замену
{", на [
делаешь замену
} на "]
И у тебя строка json (возможно я что-то недосмотрел, делал на скорую руку)
Переводиш в UTF-8 если строка в другой кодировке и переводишь через json_decode в массив.
Выходит 5 строк.
Если писать в ручную разбор строки строк будет намного больше.
Если все же решишь по своему используй рекурсивный запуск функций (ты кажется сам это написал уже).

П.С. Я слышал что в PHP есть функция разбора таких строк как у тебя... но не помню ее..

Добавлено через 8 минут и 8 секунд
Замена моя не правильная. но небольшие изменения и все будет работать.
PM MAIL   Вверх
taral
Дата 2.1.2009, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Код

$str = '{{качественные |красивые }барные стойки|мебель для ресторанов} 
{| в Москве| в городе Москва| в ассортименте}{| недорого| дешево| доступно| выгодно}';
$str = str_replace('{', '[', $str);
$str = str_replace('}', ']', $str);
$str = str_replace('|', '", "', $str);
$str = str_replace('[", "', '["', $str);
$str = preg_replace('#\[([^\["])#i', '["$1', $str);
$str = preg_replace('#([^\]])\]#i', '$1"]', $str);
$str = preg_replace('#\]([^\[\s])#i', '], "$1', $str);
$str = preg_replace('#\]\s*\[#', '], [', $str);
$result = json_decode('['.$str.']');
print_r($result);

Выводит 
Код

Array ( 
[0] => Array ( [0] => Array ( [0] => качественные [1] => красивые ) [1] => барные стойки [2] => мебель для ресторанов ) 
[1] => Array ( [0] => в Москве [1] => в городе Москва [2] => в ассортименте ) 
[2] => Array ( [0] => недорого [1] => дешево [2] => доступно [3] => выгодно ) ) 


Это сообщение отредактировал(а) taral - 2.1.2009, 00:50
PM MAIL   Вверх
svip
Дата 2.1.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



Разобрался в вашем скрипте. + помогло
Код

   $str=iconv("WINDOWS-1251", "UTF-8", $str);


А то вначале ничего не работало smile

Вот теперь нужно обратно перекодировать? перебирать весь массив? или есть способ, функция, класс для перекодирования целого массива?

Это сообщение отредактировал(а) svip - 2.1.2009, 20:55
PM MAIL WWW ICQ   Вверх
taral
Дата 2.1.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



могу кинуть функцию. там 5 строчек=)

Добавлено через 1 минуту и 36 секунд
$str=iconv("WINDOWS-1251", "UTF-8", $str);
у меня не было поскольку сам файл был в UTF-8.
Кстати про мою функцию. Я уверен что ее можно переписать более лаконично. Я ее на скорую руку накатал.
PM MAIL   Вверх
svip
Дата 4.1.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



кинь пожалуйста свою функцию.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.