Pregunta

Así que estoy tratando de crear un script que anteponga automáticamente los nombres de columna válidos con su prefijo de tabla apropiado (por ejemplo, " t. " o " r. ")

$t_columns = array('id', 'name', 'label');
$r_columns = array('related_value');

ENTRADA:

id > 1 AND (name = 'Hello' OR label IN ('World', 'Planet name AND label')) AND (related_value > 1 AND related_value < 50)

SALIDA:

t.id > 1 AND (t.name = 'Hello' OR t.label IN ('World', 'Planet name AND label')) AND (r.related_value > 1 AND r.related_value < 50)

Observe cómo no puede hacer un str_replace normal. ¿Cuál sería el código más simple (supongo que preg_replace ) para asegurar que todos los nombres de las tablas estén antepuestos correctamente?

¿Fue útil?

Solución

Esto se puede hacer de muchas maneras, y también usando regex. Yo personalmente usaría un enfoque de matriz. En primer lugar, definiría la tabla de distribución de esta manera:

$table = array(
    'id' => 't.id',
    'name' => 't.name',
    'label' => 't.label',
    'related_value' => 'r.related_value'
);

Esto facilitará mucho la llamada a str_replace ():

function mangling(&$v, $k, $table)
{
    if (($k & 1) == 0)
        $v = str_replace(array_keys($table), array_values($table), $v);
}

$spans = explode("'", ' ' . $input);
array_walk($spans, 'mangling', $table);
$output = implode("'", $spans);

Otros consejos

Después de pensar unos segundos, así es como lo abordaría:

Recorre la cadena, char por char, buscando comillas simples, pero saltando sobre los caracteres escapados. Las cosas entre dos comillas simples sin escape (es decir, las cadenas) se reemplazarían con un token único y se colocarían en una matriz asociativa, con ese token como la clave y la cadena original como el valor.

Ahora que tenemos las cadenas fuera del camino, haga un str_replace () (o preg_replace () , si insiste) para los nombres de columna conocidos. Probablemente construiría los nombres de las columnas en una matriz asociativa, con el alias de la tabla como clave y el valor como una matriz enumerada que contiene los nombres de las columnas. De esta manera, el reemplazo podría automatizarse.

Una vez que se completan los nombres de la tabla, simplemente haga un str_replace () para los tokens, para reemplazar las cadenas originales de nuevo a sus lugares, y listo.

Estoy seguro de que alguien podría preparar una expresión regular súper increíble (y probablemente casi imposible de mantener) para hacer todo esto de un solo golpe. Pero prefiero usar expresiones regulares solo en situaciones donde las expresiones regulares son realmente la herramienta correcta, no donde una CFL sería más adecuada.

No sé si una expresión regular es una buena idea aquí. Yo diría que valdría la pena la cantidad mínima de mayor complejidad computacional para realizar la validación usted mismo en PHP. Luego, en caso de que su base de datos requiera algún cambio, no tendrá que sacarse el pelo preocupándose por cómo aumentar la solidez de su expresión regular.

Como Jamie Zawinski dijo una vez: "Algunas personas, cuando se enfrentan a un problema, piensan:" Lo sé, usaré expresiones regulares ". Ahora ellos tienen dos problemas. "

En términos de crear un flujo de trabajo que asegure que está trabajando en la base de datos correcta, consideraría adoptar un enfoque orientado a objetos. Las clases para las tablas T y R pueden ser instancias secundarias de una clase modelo responsable de construir el objeto de tipo de tabla correcto usando lógica condicional dentro del mismo método, en lugar de una expresión regular.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top