PHP / RegEx - 用于预先添加表名的逻辑

时间:2009-01-17 20:31:59

标签: php regex logic

所以我正在尝试构建一个脚本,该脚本使用适当的表前缀(例如“t。”或“r。”)自动添加有效列名称。

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

INPUT:

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

输出:

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)

注意你不能做正常的 str_replace 。什么是最简单的代码(我猜 preg_replace )以确保所有表名都被正确地预先添加?

3 个答案:

答案 0 :(得分:1)

经过几秒钟的思考,这就是我要解决的问题:

遍历字符串,char by char,查找单引号,但跳过转义字符。两个未转义的单引号(即字符串)之间的东西将被替换为唯一的标记,并放入一个关联数组,该标记作为键,原始字符串作为值。

现在我们已经完成了这些字符串,请为已知列名执行str_replace()(或preg_replace(),如果您坚持的话)。我可能会将列名构造成一个关联数组,其中表的别名为键,值为包含列名的枚举数组。这样,替换可以自动化。

填写表名后,只需为代币执行str_replace(),将原始字符串替换回原位,即可完成。

我确信有人可能会在一次点击中鞭打一个非常棒的(并且可能是不可维护的)正则表达式。但我更喜欢只在正则表达式实际上是正确的工具的情况下使用正则表达式,而不是CFL更合适的情况。

答案 1 :(得分:0)

我不知道正则表达式是不是一个好主意。我想说,在PHP中自己执行验证是值得的。然后,如果您的数据库需要进行任何更改,您就不必担心如何提高正则表达式的稳健性。

正如Jamie Zawinski曾经说过的那样,“有些人在面对问题时,会想'我知道,我会使用正则表达式。'现在他们有两个问题。“

在创建确保您正在使用正确数据库的工作流方面,我考虑采用面向对象的方法。 T和R表的类可以是模型类的实例化子类,负责在同一方法中使用条件逻辑构建正确的表类型对象,而不是正则表达式。

答案 2 :(得分:0)

这可以通过很多方式完成,也可以使用正则表达式。我个人使用阵列方法。首先,我用这种方式定义了修改表:

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

这将使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);