За последние 24 часа нас посетили 17160 программистов и 1835 роботов. Сейчас ищут 1602 программиста ...

Помогите пожалуйста!!!

Тема в разделе "Регулярные выражения", создана пользователем tany, 31 июл 2014.

  1. tany

    tany Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    9
    Симпатии:
    0
    Помогите пожалуйста!!!!
    В БД записано выражение с фигурными скобками:
    Hello {$my} world

    Переменная
    Код (Text):
    1. $my = "my little";
    В переменную $str вытягивается значение с БД "Hello {$my} world",
    при выводе так и отображает: "Hello {$my} world", а нужно "Hello my little world"

    Вот что я делала:
    Код (Text):
    1. preg_match_all('/(?<={)(\$[0-9a-z]*)(?=})/', $str, $result);
    2.             foreach($result[0] as $value)
    3.             {
    4.                 echo $value;
    5.             }
    Теперь в переменной $value имеется выражение "$my".

    Но как его заменить на переменную, чтобы при выводе отображало не "Hello {$my} world", а "Hello my little world"??

    Буду очень благодарна за помощь!!!
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    На сколько я помню есть какая то функция, которая поменяет текст на соответствующие переменные, но я не помню как она называется.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  4. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    вы шутите чтоли? :)
    Код (Text):
    1. $my = 'my little';
    2. $my2 = 'big';
    3. $str = 'hello {$my} and {$my2} world';
    4.  
    5. preg_match_all('|\{\$([^\}]+?)\}|', $str, $matches);
    6. foreach($matches[1] as $var)
    7.     $str = str_replace('{$'.$var.'}', $$var, $str);
    8.  
    9. echo $str;
    Добавлено спустя 1 минуту 4 секунды:
    главное чтобы имена переменных совпадали с тем что в фигурных скобках

    Добавлено спустя 1 минуту 27 секунд:
    хотя при желании можно сделать как угодно...

    Добавлено спустя 18 минут 51 секунду:
    Код (Text):
    1. $my = 'my little';
    2. $my2 = 'big';
    3. $str = 'hello {$my} and {$my2} world';
    4. eval('$str = "'.$str.'";');
    5. echo $str;
    предлагать не буду, ибо не безопасно всё это...
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.787
    Симпатии:
    1.328
    Адрес:
    Лень
    лол XD
    а теперь замени строку $str = 'hello {$my} and {$my2} world'; на бд запрос с выводом таким же текстом и попробуй..... получилось переменные активировать ?

    Добавлено спустя 1 минуту 40 секунд:
    во вторых если применяем внутренние скобки в тексте то кавычки пишим всегда ДВОЙНЫЕ " olol {$e} fgf"
     
  6. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    не совсем понял Вашу формулровку.
    в строке
    Код (Text):
    1. $str = 'hello {$my} and {$my2} world';
    обоих примеров умышленно поставлены одиночные кавычки, чтобы строка не обработалась сразу... мы ведь по условию задачи получаем строку из БД а не из статичной строки.
    в первом примере мы обрабатываем строку через подстановку, а во втором скармливаем строку eval'у, чтобы имитировать поведение php-строки с двойными каычками.
    единсвтенное, во втором варианте, я бы addslashes сделал для исходной строки, но вообще, как я и написал выше, второй враиант не безопасен.
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.787
    Симпатии:
    1.328
    Адрес:
    Лень
    а тьфу точн. мануал проглядел
     
  8. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    вообще, есть еще как минимум 1 вариант решения этой задачи через другой вариант подстановки:
    Код (Text):
    1. $ar = array('my'=>'my little', 'my2'=>'big');
    2. $str = 'hello {$my} and {$my2} world';
    3. foreach($ar as $var=>$word)
    4.     $str = str_ireplace('{$'.$var.'}', $word, $str);
    5. echo $str;
    но это уже вариации на тему первого варианта

    еще вариант...
    Добавлено спустя 13 минут 37 секунд:
    Код (Text):
    1. $ar = array('my'=>'my little', 'my2'=>'big');
    2. $str = 'hello {$my} and {$my2} world';
    3. extract($ar);
    4. eval('$str = "'.$str.'";');
    5. echo $str;
    только про addslashes не надо забывать... ну и лично я не поклонник eval, хотя выглядит он всегда соблазнительно :)
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну мне кажется у автара надо уточнить что ему надо, всего в одном месте, поменять {$my} на соответствующею переменную или же постоянно, разные переменные менять в разных текстах.
     
  10. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    (((
    viewtopic.php?f=13&t=48868&hilit=+preg_replace_callback
    Ты так и не разобрался?
     
  11. tany

    tany Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    9
    Симпатии:
    0
    Спасибо! Нужно разные переменные менять в разных текстах.
     
  12. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    тогда всетаки рекомендую

    Код (Text):
    1. $ar = array('my'=>'my little', 'my2'=>'big');
    2. $str = 'hello {$my} and {$my2} world';
    3. foreach($ar as $var=>$word)
    4.    $str = str_ireplace('{$'.$var.'}', $word, $str);
    5. echo $str;
    а вот вариант с, уже ни раз упоминавшимся, preg_replace_callback
    Код (Text):
    1. $arr = array('my'=>'my little', 'my2'=>'big');
    2. $str = 'hello {$my} and {$my2} world';
    3. $str = preg_replace_callback('|\{\$([^\}]+?)\}|', function($m) use ($arr)
    4. {
    5.     return $arr[$m[1]];
    6. }, $str);
    7. echo $str;
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    эмм.. на меня навалилось много других заданий, но в ближайшее время мне это действие понадобиться и будут разбираться.
     
  14. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    отписался в тему, посмотрите, может поможет....
     
  15. tany

    tany Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    9
    Симпатии:
    0
    Всем большое спасибо, воспользовалась вот этим кодом, отлично подошел)
    Код (Text):
    1. $my = 'my little';
    2. $my2 = 'big';
    3. $str = 'hello {$my} and {$my2} world';
    4.  
    5. preg_match_all('|\{\$([^\}]+?)\}|', $str, $matches);
    6. foreach($matches[1] as $var)
    7.     $str = str_replace('{$'.$var.'}', $$var, $str);
    8.  
    9. echo $str;
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    почему этот? массивы небось используются. есть способ проще.
     
  17. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    Я бы использовал вариант с массивом. Смотрите последние два предложенных мной варианта.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    форыч не нужен
     
  19. s.melukov

    s.melukov Новичок

    С нами с:
    31 июл 2014
    Сообщения:
    78
    Симпатии:
    0
    Код (PHP):
    1. $what       = array_keys($arr);
    2. $replace    = array_values($arr);
    3. $str = str_ireplace($what, $replace, $str); 
    В случае если массив вида
    Array('{$var1}'=>'little', '{$var2}'=>'big')

    Добавлено спустя 28 минут 45 секунд:
    Код (PHP):
    1. $str = 'hello {$my} and {$my2} world';
    2. $arr = Array('{$my}'=>'little', '{$my2}'=>'big');
    3. $str = str_ireplace(array_keys($arr), $arr, $str); 
    4. echo $str;