За последние 24 часа нас посетили 17572 программиста и 1727 роботов. Сейчас ищут 1025 программистов ...

Считать переменные из строки (файла)

Тема в разделе "PHP для новичков", создана пользователем boo, 15 июл 2011.

  1. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    Может есть возможность считать без регулярок переменные из файла?
    просто пробелов может быть несколько и перед массивами и перенос строки в значении
    PHP:
    1.  
    2. <?php
    3. $a = '18214';
    4. $b='45754';
    5. $c    =                '32523';
    6. $d['array'] = '356754';
    7. $e ['array']         =         '4277';
    8. $f      ['array'] - '3264634
    9. 347347347
    10. 34634645';
    11. $g ['array'] =
    12. '326346';
    13. ?>
    14.  
    хочется считать переменные в стандартном виде в массив(например без пробелов array ([0] => $a['array']='1243545';) )
    или всё таки нужно регулярное писать с символами $ и = ?
     
  2. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    что мешает использовать trim ?
     
  3. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    регулярка тогда. ни чего не мешает. я думаю как без неё может можно.(чтоб при нестандартных вариантах считалось нормально)
     
  4. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    что то я не чего не понял :)
    у вас файл php?
    как вы его читаете?
    почему просто не включить через include?
    зачем регулярка если для значений переменных можно использовать trim что бы убрать любые символы с начала или конца?
    все остальные пробелы не мешают? хоть так
    PHP:
    1. $a [] = 'a';
    хоть так
    PHP:
    1. $a         [] =       'a';
    результат будет один
     
  5. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    нужно считать в массив. выполнение файла или инклуд недопустим.
     
  6. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    Вообщем не совсем понял, но может тогда поможет вначале считать файл в строку
    потом обрезать <?php и ?>, так как я понял они будут не нужны
    потом разбить $array = explode(';',$file_string); на пары переменная = значение
    потом разбить по = explose('=', $array_item)
    потом состряпать из этого ваш массив применив ко всем ключам и значениям trim()
    или же str_replace с заменой пробелов на ''
     
  7. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    ок, спасибо за рассуждение и ответ, так и буду наверно делать, что то похожее изначально думал. но только придётся смотреть несколько вариантов. .т.к может быт и такое например:
    PHP:
    1.  
    2. $a = '&nbps;<b>tekst</b>';
    3.  
    а тут уже по точки с запятой только нельзя резать, надо по: ';
     
  8. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    а если будет так
    PHP:
    1. $a = 'fdfdsf'
    2. ;
    :)
     
  9. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    вот в этом то и проблема, символ = аналогично может встречается т.к. там хтмл попадается

    или может лучше как то дважды файл прогонять, сначала узнав точно имена переменной, затем уже значение для каждой
     
  10. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    но я думаю с таким набором правил даже регуляркой не так просто это сделать будет.
     
  11. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    PHP:
    1. <?php
    2. include('file.php');
    3. echo 'Кол-во переменных в файле: ' .count( get_defined_vars());
    4. ?>
    Но я так полагаю, вам нужен этот код:
    PHP:
    1. <?php
    2.  
    3. $defined_vars = array();
    4. $var_names = array_keys(get_defined_vars());
    5.  
    6. foreach ($var_names as $var_name)
    7. {
    8.     $defined_vars[$var_name] =& $$var_name;
    9. }
    10.  
    11. ?>
    (Скопировал его с php.net, даже писать не пришлось. Попробуйте когда-нибудь и поискать то, что ищите, а не только спросить. А может даже и ответить на чей-то вопрос.
     
  12. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    neverlose
     
  13. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Это получается PHP lexer в PHP ? :) Ну если человек сможет написать грамматику LL(k) сам, пусть пишет. Я думаю тогда бы он и вопросом этим тут не задавался. Лично мне нужно приложить массу усилий чтобы это сделать.

    Конечно если файлы, которые он хочет парсить расписаны по определённым ограничениям и их достаточно много (ограничений), это можно сделать и более простыми способами. Но если там файл core.php какого-нибудь phpBB на ООП, распарсить всё это дело можно только PHP lexer'ом.
     
  14. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    решение нашлось такое, хоть и с инклудом:

    PHP:
    1.  
    2. include 'file.php';
    3.  
    4. print_r($vars);
    5.  
    но опять же, это если в файле все переменные лежат в массиве $vars, мне этот вариант подходит.

    может кто знает как всё ж все собрать, если вдруг будет не $vars
     
  15. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    при чём тут вообще тогда ob_start? с какой целью вы его использовали? это просто функция буферизации вывода
     
  16. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    ну да. если в файле изначально вывода нету (а в моём случае нету), то она не нужна.

    выходит так что если во всех файлах лежат массивы (т.е. одноимённый массив во всех файлах) то можно и с инклудом работать, и каждый раз массив очищать.

    т.е. с таким вариантом подходит инклуд:
    PHP:
    1.  
    2. <?php
    3. $arr['a'] = '18214';
    4. $arr['b']='45754';
    5. $arr['c']    =                '32523';
    6. $arr['d']['array'] = '356754';
    7. $arr['e'] ['array']         =         '4277';
    8. $arr['f']      ['array'] - '3264634
    9. 347347347
    10. 34634645';
    11. $arr['g'] ['array'] =
    12. '326346';
    13. ?>
    14.  
     
  17. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Easy

    чтобы код не исполнялся надо использовать не include а require

    Тогда и ob_ не нужны будут
     
  18. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    tommyangelo впервые слышу что при использовании require код не выполняется :)
     
  19. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    PHP:
    1. <?php
    2. function get() {
    3.     include "file.php";
    4.     return  get_defined_vars();
    5. }
    6.  
    7. echo "<pre>";
    8. print_r(get());
    9. echo "</pre>";
     
  20. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    СУПЕР :!: оно самое! get_defined_vars - тож пробовал использовать, но в функцию не ставил. (выдавал все переменные системы)

    Благодарю Easy!

    ЗЫ: заглушку всё же поставлю, попадаются файлы с БОМ (
     
  21. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Easy

    Я немного не то имею в виду)))

    Потом найду пример покажу)

    В данном случае ты прав.
     
  22. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Только проснулся ?))
     
  23. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    ну так собственно он пробовал, просто