Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Разбивка текста в массив


Автор: DioNiR 14.4.2012, 01:08
Всем Здрасте smile

Есть такая проблема smile

Допустим мы имеем текст:
Код

$str = '
    [Tag]
        111111111
        [Tag]
            222222222
            [Tag]
                333333333
                [Tag]
                    444444444
                [/Tag]
            [/Tag]
        [/Tag]
    [/Tag]';


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

Если брать простой регуляркой типо:
Код
"'\[Tag\](.*?)\[/Tag\]'is"

То вхождение будет до первого [/Tag]. 
Но мне надо чтоб были все.


Собственно вопрос как этот текст превратить в массив с такими же вхождениями.

Отмечу что не обязательно кодом smile
Можно просто натолкнуть меня на мысль, или рассказать как решается проблема

Автор: Fortop 14.4.2012, 06:30
Если текст именно такой, то

замените все '[Tag]' на ',array('
'[/Tag]' на ')'

затем сделайте trim($str,',') чтобы убрать первую запятую

и добавьте в начало строки '$myVar = '  а в конец ';'

После чего eval(строка)

Автор: Sanchezzz 14.4.2012, 10:43
я бы переделал тег в <div> или <tag> str_replace
и воспользовался классом 
http://habrahabr.ru/post/110112/
под ваши задачи 
в инструкции не написано что если текст приходит битым то нужно  чтобы html код был полностью, с кодировкой в метотегах

массив получится немного другим но с вложенностью

это теория но должно получится и главное все без eval ))

Автор: Sanchezzz 14.4.2012, 11:06
тока проверил массив не такой строится 

Автор: Fortop 14.4.2012, 14:27
Sanchezzz, попробуйте думать что ли.
Иногда бывает полезно.
В данном конкретном случае eval вполне решает вопрос.

Код к вычислению
Код

$myVar = array(
        111111111
        ,array(
            222222222
            ,array(
                333333333
                ,array(
                    444444444
                )
            )
        )
    );


дамп переменно $myVar после eval
Код

array(2) {
  [0]=>
  int(111111111)
  [1]=>
  array(2) {
    [0]=>
    int(222222222)
    [1]=>
    array(2) {
      [0]=>
      int(333333333)
      [1]=>
      array(1) {
        [0]=>
        int(444444444)
      }
    }
  }
}


Автор: Sanchezzz 15.4.2012, 11:37
Fortop eval это зло и глобал тоже зло вполне есть способы написания сладкого решения...
А знаете что произойдет если в массиве будет содержатся функция аля sql атака
вот поэтому мой минус вам в ответ обоснованный

Автор: Fortop 15.4.2012, 16:33
Sanchezzz, читать умеем?

Рекомендую перечитать подробнее то, что я написал.
Цитата(Fortop @  14.4.2012,  06:30 Найти цитируемый пост)
Если текст именно такой

Если автор пытается таким образом обрабатывать что-то другое, то ССЗБ.


При всем этом, мой вариант работает, а ваши тыкания пальцем в небо нет.

Цитата(Sanchezzz @  15.4.2012,  11:37 Найти цитируемый пост)
А знаете что произойдет если в массиве будет содержатся функция аля sql атака

Охо-хо smile ну просветите нас темных smile Заодно примеры sql-атак (видимо sql-injection подразумевались) приведете.

И может расскажете, при каких условиях с globals начинаются проблемы?
Или вы из категории тех, кто взял не пониманием, а заучиванием?

Автор: Sanchezzz 15.4.2012, 21:53
Цитата

При всем этом, мой вариант работает, а ваши тыкания пальцем в небо нет.
 Возьмите нобелевскую премию с моей полки , и да кажется если тыкать пальцем в строчки то я кажется ниже постом написал что массив получился неверным 
Про эвал я вам уже написал любой уместный синтаксис PHP будет выполнятся. А если эти теги будет заполнять посетитель сайта, такой же смышленый как я?)  я лично поступлю на месте пользователя как человек знающий хотя бы минимальные знания о пхп и его синтаксис убить систему сайта потому что это весело и будет уроком что так делать было нельзя . 

Цитата

И может расскажете, при каких условиях с globals начинаются проблемы?
Или вы из категории тех, кто взял не пониманием, а заучиванием?


Глобальную переменную может случайно переопределить. Получим сложно отлавливаемую ошибку. 
Без global улучшается читабильность кода. 
Также другой кодер копаясь вашем коде может  не понять откуда эта переметная появилась
Также глобальные переменные всегда весят в памяти когда нежели локальные освобождаются (люблю экономить каждый байт так легче на душе  )
Также я очень много работал с сайтами написанных времен PHP4 и когда global у программистах был как икона всюду и везде использовался.

Лично мое мнение код содержащий global,eval столь ужасен что можно приравнять govnoкоду.

Автор: Aliance 16.4.2012, 09:49
DioNiR, поиск в гугле по словам "жадность квантификатора" должна решить проблему с регулярными выражениями.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)