Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Переделать строку любой длину

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Roler
Отправлено: 07 Марта, 2010 - 18:31:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Имеется нечто вроде


Нужно в итоге получить


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

CODE (htmlphp):
скопировать код в буфер обмена
  1. $this->file = preg_replace('#\{([A-z0-9_\-\$]*)\.([A-z0-9_\-]*)\}#U','{\1[\'\2\']}',$this->file);


Я понимаю, нужно преобразовывать постепенно, каждый раз обрамляя в скобки по одному ключу, и при этом запоминать то, что мы не трогаем. Но как? У меня либо не получается ничего, либо всё страшно.

P.S. Пардон за название темы.

(Отредактировано автором: 07 Марта, 2010 - 18:35:22)

 
 Top
Ch_chov
Отправлено: 07 Марта, 2010 - 20:29:41
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




1. Первую точку заменить на ['
2. Последнюю точку заменить на ']
3. Все остальные на ']['
 
 Top
Roler
Отправлено: 07 Марта, 2010 - 20:31:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Слишком много выражений. Должен же был способ уложиться в одно?
И какой-то слишком неуниверсальный. Там же куча подобных вхождений в коде.

(Отредактировано автором: 07 Марта, 2010 - 20:32:44)

 
 Top
movEAX
Отправлено: 07 Марта, 2010 - 22:06:49
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




PHP:
скопировать код в буфер обмена
  1. function dot2bracket($matches){
  2.         global $firstReplace;
  3.         return ($firstReplace)?"']['":("['".$firstReplace++);
  4. }
  5. $str = preg_replace_callback( '!\.!', 'dot2bracket', rtrim( $str, '}' ) )."']}";


Еще вариант:
PHP:
скопировать код в буфер обмена
  1. $str = explode( '.', rtrim( $str, '}' ), 2 );
  2. echo $str = $str[0]."['".str_replace( '.', "']['", $str[1] )."']}";


-----
армия.. самое убогое место
 
 Top
Champion Супермодератор
Отправлено: 08 Марта, 2010 - 08:26:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Roler пишет:
кол-во уровней может быть любым
Если скажешь, что за уровни, напишу как сделать
 
 Top
Roler
Отправлено: 08 Марта, 2010 - 08:33:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Ну то есть вложенность.
от {arr.key} до {arr.key.param.blam.blam}
 
 Top
Champion Супермодератор
Отправлено: 08 Марта, 2010 - 08:52:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Не, одним выражением вряд ли. Если только с callback.
А вот так нормально вроде:
PHP:
скопировать код в буфер обмена
  1. preg_match_all('/\{.+?\}/', $str, $matches);
  2. foreach($matches as $src){
  3. $dst = preg_replace('/\{(\w+)\./', '\1[', $src, 1);
  4. $dst = str_replace('.', '][', $dst);
  5. $dst = str_replace('}', ']}', $dst);
  6. $str = str_replace($src, $dst, $str);
  7. }

Кстати, если весь текст состоит из этих {arr.sdf.sdf}, то цикл не обязательно. Можно просто три эти команды и без последнего параметра в preg_replace

Хотя, вариант с callback наверное лучше.


Отредактировано модератором: movEAX, 08 Марта, 2010 - 11:53:39
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB