+
+
+
+
+
+//PARSER_PARENTESIS {{{
+//Funcion que parsea por el contenido entre parentesis
+//Devuelve un array de arrays
+function parseParentesis($value) {
+
+ $pos = 0;
+ $content = true;
+ $char = true;
+ $value = substr(substr(trim($value), 1), 0, strrpos(substr(trim($value), 1),')'));
+
+ while ($char) {
+ //Busco la siguiente separacion ( , o = ) {{{
+ if (!strpos($value, ',') && !strpos($value, '=')) {
+ $char = false;
+ }
+ elseif (!strpos($value, ',') && strpos($value, '=')) {
+ if ($value{strpos($value, '=') + 1} == '>') {
+ $char = '=>';
+ }
+ else {
+ $char = '=';
+ }
+ }
+ elseif (strpos($value, ',') && !strpos($value, '=')) {
+ $char = ',';
+ }
+ elseif (strpos($value, ',') && strpos($value, '=') && strpos($value, ',') > strpos($value, '=')) {
+ if ($value{strpos($value, '=') + 1} == '>') {
+ $char = '=>';
+ }
+ else {
+ $char = '=';
+ }
+ }
+ elseif (strpos($value, ',') && strpos($value, '=') && strpos($value, ',') < strpos($value, '=')) {
+ $char = ',';
+ }
+ //}}}
+
+ //Obtengo el nombre a partir del caracter de separacion {{{
+ $result[$pos]['name'] = (strpos($value, $char)) ? substr($value, 0, strpos($value, $char)) : $value;
+ $pos_del = strpos($value, $char);
+ //}}}
+
+ //Busco el valor asociado {{{
+ if ($char == '=') {
+ $op_value = (strpos($value, $char)) ? trim(substr($value, strpos($value, $char) + 1)) : false;
+ }
+ elseif ($char == '=>') {
+ $op_value = (strpos($value, $char)) ? trim(substr($value, strpos($value, $char) + 2)) : false;
+ }
+ //}}}
+
+ //Parseo el resto de la linea {{{
+ if ($op_value) {
+ if ($op_value{0} == "'" || $op_value{0} == '"') {
+ $pos_del = parseComillas($op_value);
+ if ($pos_del == 0) {
+ $result[$pos]['value'] = "''";
+ }
+ else {
+ $op_value = substr($op_value, 1);
+ $result[$pos]['value'] = substr($op_value, 0, $pos_del);
+ }
+ }
+ elseif (trim(strtolower(substr($op_value, 0 ,5))) == 'array') { //RECURSIVIDAD {{{
+ $op_value = trim(substr($op_value, 5));
+ $op_value = trim(substr($op_value, 1)); //Saco el (
+
+ if ($op_value{0} == ')') {
+ $result[$pos]['value'] = 'array()';
+ }
+ else {
+ //Busco a manopla el ) que cierra el array(##ALGO##) {{{
+ $subpos = 0;
+ $seguir = true;
+ $temp = $op_value;
+ while ($seguir) {
+ if (($temp{$subpos} == '"' || $temp{$subpos} == "'") && $temp{$subpos - 1} != '\\') {
+ $pos_del = parseComillas(substr($temp,$subpos)) + $subpos;
+ $subpos = $pos_del + 2;
+
+ if (trim($temp{$subpos}) == ')') {
+ $seguir = false;
+ }
+ }
+ else {
+ if ($subpos > strlen($temp)) {
+ $seguir = false;
+ }
+ $subpos++;
+ }
+ }
+ //}}}
+ $par = parseParentesis('('.substr($op_value, 0 , $subpos).')');
+ $result[$pos]['value'] = 'array(';
+ foreach ($par as $p) {
+ $result[$pos]['value'] .= $p['name'];
+ if (@$p['value']) {
+ $result[$pos]['value'] .= '=>\''.$p['value'].'\',';
+ }
+ else {
+ $result[$pos]['value'] .= ',';
+ }
+ }
+ $result[$pos]['value'] = rtrim($result[$pos]['value'],',');
+ $result[$pos]['value'] .= ')';
+ $pos_del = $subpos;
+ }
+ } //}}}
+ else {
+ //Busco la , de separacion con el proximo parametro
+ //en caso de ser el utlimo lo asigno como viene
+ if ($pos_del = strpos($op_value, ',')) {
+ $result[$pos]['value'] = ($pos_del) ? trim(substr($op_value, 0, $pos_del)): $op_value;
+ }
+ }
+ $value = $op_value;
+ }
+ //}}}
+
+ //Borro de $value lo que ya parsee {{{
+ if ($pos_del) {
+ $value = trim(substr(trim($value), $pos_del + 2));
+ }
+ if (!$value) {
+ $char = false;
+ }
+ //}}}
+ $pos++;
+ $op_value='';
+ }
+ return $result;
+}
+//}}}
+//PARSER_COMILLAS {{{
+//Funcion que parsea por el contenido entre comillas
+//Devuelve la pos de la ' que cierra el comentario
+function parseComillas($value) {
+ $result = -1;
+ $ii = 1;
+ $cont = true;
+ switch ($value{0}) { //{{{
+ case "'":
+ $char = "'";
+ break;
+ case '"':
+ $char = '"';
+ break;
+ }//}}}
+ $value = substr($value, 1); //Saco la ' o " del comienzo del string
+ if ($value{0} == $char) {
+ $result = 0;
+ }
+ else {
+ while ($cont) { //{{{
+ $ii++;
+ if ($value{$ii} == $char) {
+ if ($value{$ii - 1} != '\\') {
+ $cont = false;
+ $result = $ii;
+ }
+ }
+ }//}}}
+ }
+ return $result;
+}
+//}}}
+