PHP - синтаксический анализ переменной шаблона с регулярным выражением - PullRequest
0 голосов
/ 05 сентября 2010

Я должен проанализировать этот файл шаблона ($ html):

{$myFirstVariable}
{$myMainVar:MYF1,"x\:x\,x",2:MYF2:MYF3,false}
{$myLastVariable:trim}

После этого мой php-парсер:

$regexp = '#{\$(?<name>.+?)(\:(?<modifiers>.+?))?}#';

preg_replace_callback($regexp, 'separateVariable', $html);

function separateVariable($matches) {
    $varname = $matches['name'];

    print $varname."\n";

    if (isset($matches['modifiers'])) {
        $modifiers = $matches['modifiers'];

        $modifiers = preg_split('#(?<!\\\):#', $modifiers);
        $parsed = array();

        foreach ($modifiers as $modifier) {
            $modifier = preg_split('#(?<!\\\),#', $modifier);
            $parsed[array_shift($modifier)] = $modifier;
        }

        // parsed[myFuncName] = Array(2ndArg, 3rdArg)

        print_r($parsed);
    }

    print "\n";
}

Все работает, за исключением того, что мне нужно бежать ':'и ',' в {$ myMainVar: ...} со знаком '\'.

У вас есть какое-либо решение освободить меня от '\'?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2010

Регулярное выражение не может возвращать вложенный массив, кроме того, то, что вы пытаетесь, кажется больше, чем обработка текста (substr, explode ..), чем необходимостьиспользуйте регулярное выражение.Кроме того, ваш пример не проясняет, как работает стандартная обработка ввода.

Я предлагаю: при создании рекурсивной функции, которая работает с логикой вашего unserialiing процесса, эта функция будет использовать switchпадежи и функции работы со строками .

0 голосов
/ 05 сентября 2010

Если вам это поможет:

$string = '{$myVariable:trim:substr,1,2}';

if (preg_match("#^\{\\$([a-zA-Z]+)\:([a-z]+)\:([a-z]+)\,([0-9]+)\,([0-9]+)\}$#", $string, $m)){
$result = <<<RESULT
Array (
    "{$m[1]}",
    Array (
        "{$m[2]}" => Array(),
        "{$m[3]}" => Array(
            {$m[4]},
            {$m[5]}
        )
    )
)
RESULT;
}
echo $result;
0 голосов
/ 05 сентября 2010

Regex не слишком поможет вам в этом, потому что данные имеют несколько уровней. Может быть проще сначала разделить данные на :, а затем проанализировать результат (то есть теперь разделить substr,1,2 на ,). Проблема в том, что вам понадобится несколько регулярных выражений. Регулярные выражения не возвращают массивы и не выполняют многомерных сопоставлений; они используются для анализа полей данных, формат которых известен заранее.

...