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
Форумы портала PHP.SU :: Версия для печати :: Переделать строку любой длину
Форумы портала PHP.SU » PHP » Регулярные выражения » Переделать строку любой длину

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

1. Roler - 07 Марта, 2010 - 18:31:27 - перейти к сообщению
Имеется нечто вроде


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


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

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


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

P.S. Пардон за название темы.
2. Ch_chov - 07 Марта, 2010 - 20:29:41 - перейти к сообщению
1. Первую точку заменить на ['
2. Последнюю точку заменить на ']
3. Все остальные на ']['
3. Roler - 07 Марта, 2010 - 20:31:34 - перейти к сообщению
Слишком много выражений. Должен же был способ уложиться в одно?
И какой-то слишком неуниверсальный. Там же куча подобных вхождений в коде.
4. movEAX - 07 Марта, 2010 - 22:06:49 - перейти к сообщению
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] )."']}";
5. Champion - 08 Марта, 2010 - 08:26:14 - перейти к сообщению
Roler пишет:
кол-во уровней может быть любым
Если скажешь, что за уровни, напишу как сделать
6. Roler - 08 Марта, 2010 - 08:33:46 - перейти к сообщению
Ну то есть вложенность.
от {arr.key} до {arr.key.param.blam.blam}
7. Champion - 08 Марта, 2010 - 08:52:36 - перейти к сообщению
Не, одним выражением вряд ли. Если только с 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 наверное лучше.

 

Powered by ExBB FM 1.0 RC1