0

因此,我正在尝试构建一个脚本,该脚本会自动在有效列名前面加上适当的表前缀(例如“t.”或“r.”)

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

输入:

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)以确保所有表名都正确添加?

4

3 回答 3

1

经过几秒钟的思考,这是我的解决方法:

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

现在我们已经排除了字符串,为已知的列名做一个str_replace()(或者,如果你坚持的话)。preg_replace()我可能会将列名构造成一个关联数组,以表的别名作为键,将值作为包含列名的枚举数组。这样,更换可以自动化。

填写表名后,只需str_replace()对标记执行 a 操作,将原始字符串替换回原位,就完成了。

我敢肯定,有人可能会推出一个超级棒(而且可能几乎无法维护)的正则表达式,一键完成所有这些工作。但我更喜欢仅在正则表达式实际上是正确工具的情况下使用正则表达式,而不是 CFL 更适合的情况。

于 2009-01-17T20:52:24.560 回答
0

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

正如 Jamie Zawinski 曾经说过的,“有些人在遇到问题时会想‘我知道,我会使用正则表达式’。现在他们有两个问题。”

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

于 2009-01-17T20:58:41.817 回答
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);
于 2009-10-09T18:09:56.920 回答