因此,我试图建立一个脚本,该脚本自动地预先考虑有效的列名称与其相应的表的前缀(例如,“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 ),以确保所有的表名前面加上正确?

有帮助吗?

解决方案

这可以以大量的方式来完成,并且还使用正则表达式。我个人使用数组的方式。首先,我定义的mangling表是这样的:

$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);

其他提示

几秒钟的思考之后,这里就是我想解决它:

由字符通过串走,焦炭,寻找单引号,但跳过转义字符。 2个未转义单引号(即,字符串)之间的那些东西与唯一的令牌来代替,并投入一个关联数组,与该令牌作为密钥,和原始字符串作为值。

现在,我们有串出的方式,对已知列名做str_replace()(或preg_replace(),如果你坚持)。我可能会构建列名到一个关联数组,与表的别名为重点,和值包含列名枚举数组。这样,更换可以自动化。

在表名称填写,只是做一个str_replace()的令牌,以取代原来的字符串回到自己的地方,你就大功告成了。

我敢肯定有人会掀起一个超级真棒(也许旁边不可维护的)正则表达式做这一切的一重击。但我更喜欢使用正则表达式只有在情况下正则表达式实际上是正确的工具,而不是一个地方CFL会更适合。

我不知道,如果正则表达式是这里的好主意。我会说这将会是值得计算复杂度增加的最小量在PHP执行自己的验证。然后,如果您的数据库进行任何改变,你会不会拉你的头发,担心如何增加你的正则表达式的鲁棒性。

由于杰米·萨温斯基曾说过,“有些人,当遇到一个问题,认为‘我知道,我将使用正则表达式。’现在他们有两个问题。“

在创建工作流程,将确保你在正确的数据库上的工作方面,我会考虑采取一种面向对象的方法。对于T和R的表的类可以被实例化负责使用相同的方法中的条件的逻辑,而不是一个正则表达式构建正确的表型对象模型类的儿童。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top