<?php
define('DBL_STR', '"(?:[^\\\\"]+|\\\\.)*"');
define('SGL_STR', '\'(?:[^\\\\\']+|\\\\.)*\'');
define('DECIMAL', '(?:[-+]?[0-9\.]+)');
define('HEX', '(?:0x[0-9a-fA-F]+)');
define('RVAL', HEX.'|'.DECIMAL.'|'.DBL_STR.'|'.SGL_STR);
define('LVAL', '(?:\$[a-zA-Z_](?:[a-zA-Z_0-9]+)?(?:\[\s*(?:'.RVAL.')\s*\])*)');
$text = '$arr[\'abc\'][ -23 ]';
header('Content-type: text/plain');
if (preg_match('/^' . LVAL . '$/', $text, $matches)) {
print_r($matches);
} else {
echo 'Didn\'t match';
}
Эта шняга правильно понимает $arr['abc'][ -23 ], но не справится с $arr['abc'][$x]. Здесь не хватает рекурсивного определения.
Help!