Здравствуйте товарищи. Возник архисложный вопрос, который никак мной нерешается. Безуспешно стучать в бубен уже нет сил. Поможите товарищу. Вопрос такой. Имеется строка PHP: $str = 'Уважаемый {name}, ну и имя у вас!'; Имеется База данных. Не стану расписывать запросы и т.п. На выходе получаю массив примерно следующий PHP: $arr = ('name'=>'Муштандроид', 'age'=>30); Так вот, задача в том, чтобы заменить вот это в строке {name} на соответствующее имя по ключу из массива. Т.е. выражение в фигурных скобках должно идентифицировать ключ массива и выводить его значение. Я написал следующий код PHP: $str = preg_replace ("/\{(.*)\}/U", $arr["$1"], $str); Не сработало. Перебирая всевозможные варианты перестановки кавычек, совсем отчаялся и написал следующее: PHP: $str = preg_replace_callback ("/\{(.*)\}/U", create_function('$matches', return $arr[$matches[1]];'), $str); Но и это возвращает пустой результат, хотя если убрать $arr вот так PHP: $str = preg_replace_callback ("/\{(.*)\}/U", create_function('$matches', return $matches[1];'), $str); То код исправно выводит содержание между фигурными скобками. Может у меня в синтаксисе что-то не так... подскажите пожалуйста, как мне это реализовать? Заранее спасибо.
Мазафака =)) Скорей архидетский =) PHP: <?php $str = 'Уважаемый {name}, ну и имя у вас!'; $replacements = ('name'=>'Муштандроид', 'age'=>30); // Замена $str = str_replace(array_keys($replacements), $replacements, $str); ?> Усё
Уважаемый {Мутандроид}, ну и имя у вас! Мне нужен поиск именно по маске, потому что они гораздо более сложные, с кучей переменных на выходе. Я это написал примитивный пример для того чтобы понять как имея переменную $1 из результата работы маски использовать в качестве ключа для массива.
Я не заметил или вы об этом не написали? =)) Возможен точно такой же перебор. Делается маска и вхождение, обработанное preg_quote. В цикле идет перебор. Хотя реальной задачи я не вижу, но подход такой.
Есть конечно вариант такой например PHP: $str = preg_replace_callback ("/\{(.*)\}/U", "get_value", $str); function get_value($v) { global $arr; return $arr[$v]; } И он в принципе работает. Но мне почему-то кажется, что это жуткий онанизм. Использовать целую функцию, чтобы выдрать одно значение из массива. Хочется чтобы коротко, ясно, резко и неожиданно как понос. Да и циклы хотелось бы оставить на крайний случай
Ура товарищи! Проблема решилась наконец-то! PHP: $str = preg_replace_callback ("/\{(.*)\}/U", create_function( '$matches', 'global $arr; return $arr[$matches[1]];'), $str); И всего одна строчка!