php - php/正规表达式 prepending表名称的逻辑

  显示原文与译文双语对照的内容
0 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 ) 是什么

时间:原作者:7个回答

0 0

这可以用很多方法来完成,也可以使用 正规表达式 。 我个人会使用 array 方法。 首先,我将以这种方式定义重整表:

$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);
原作者:
0 0

几秒钟后,我将对它进行处理:

通过字符遍历字符串,查找单引号,但跳过转义字符。 两个未转义单引号之间的内容( 例如 。 字符串将被替换为唯一标记,并将它的放入关联 array,并将该标记作为键作为值。

现在已经经有了字符串,请执行已经知列名称的str_replace() ( 或者 preg_replace() 如果你坚持) 。 我可以能将列名构造成关联 array,具有表的别名,以及包含列名的枚举 array 。 这样,替换就可以自动完成。

一旦表名被填充,只要为标记做一个 str_replace(),就可以以将原始字符串替换回它们的位置。

我相信有人可能会用一个超级出色的( 而且可能是 unmaintainable ) regexp来做所有这些事情。 但是我更喜欢在 正规表达式 实际上是正确的工具,而不是在哪里更适合于上下文。

原作者:
...