на данный момент, я проверил работу и все таки первый вариант был рабочим. Я подумал, что он не работает, потому что использовал в тестовом варианте сейчас в названиях полей символы которые не разрешены.
обратите внимание в содержание константы ALPHABET
Все символы которые она содержит, являются разрешенными. В случае если в шаблоне в названии переменной есть символ которые не является разрешенным, например цифра или английская буква в верхнем регистре, то эта переменная не будет воспринята. И замены не произойдет. А вобще скиньте ваш код конкретный, который не работает. Я попробую вам помочь.
А так даже тот код который я скидывал вполне рабочий. Переменные работают для такого объекта прекрасно:

Код AS3:
package
{
/**
* ...
* @author Shirobok Pavel (ramshteks@gmail.com)
*/
public class TestObject
{
public var test:String = "111";
public var test1:int=112;
public var test2:*= 113;
public function TestObject()
{
}
public function get test4():String {
return "114"
}
public function get test5():int {
return 115;
}
}
}
Использование:

Код AS3:
trace(StringUtils.printfwv("%test% %test1% %test2% %test4% %test5% ", new TestObject()));//Trace: 111 112 113 114 115
Добавлено через 17 минут
единственно нашел ошибку с вылитающим эксепшеном, если в объекте нет такой переменной. Теперь обработка не прекращается, а просто выдается трейс. Ну и переменная остается незамененной. +Добавил в алфавит цифры. Вот исправленный вариант

Код AS3:
static public function printfwv(string:String, vars:Object):String {
if (vars == null) return string;
const NOT_EXIST:int = -1;
const ALPHABET:String = "qwertyuiopasdfghjklzxcvbnm_1234567890";
const S_TEXT:int = 1;
const S_VAR:int = 2;
const PREFIX:String = "%";
//быстрая проверка на содержание двух %
var iof:int = string.indexOf(PREFIX);
if (iof == NOT_EXIST) {
return string;
}else {
if (string.indexOf(string, iof++) == NOT_EXIST) return string;
}
//
var src:String = string;
var buffer:String = "";
var state:int = S_TEXT;
var var_buff:String = "";
var c:String;
for (var i:int = 0, len:int = src.length; i < len; i++) {
c = src.charAt(i);
switch(state) {
case S_TEXT:
if (PREFIX == c) {
state = S_VAR;
}else {
buffer += c;
}
break;
case S_VAR:
if (ALPHABET.indexOf(c) != NOT_EXIST) {
var_buff += c;
}else {
if (c == PREFIX) {
var correct_object:Boolean = true;
try {
vars[var_buff];
if (vars[var_buff] == undefined) correct_object = false;
}catch (e:Error) {
correct_object = false;
trace("warning: was catched exception when using source-object:" + e.message);
}
if (!correct_object){
buffer += PREFIX + var_buff;
var_buff = "";
i--;
state = S_TEXT;
}else {
buffer += vars[var_buff];
}
}else{
buffer += PREFIX + var_buff + c;
}
var_buff = "";
state = S_TEXT;
}
break;
}
}
if (state == S_VAR) {
buffer += PREFIX + var_buff;
}
return buffer;
}