【发布时间】:2015-10-21 14:48:37
【问题描述】:
我正在编写一个数据库查询管理器类。在我的类中,表前缀的特征是#__。我想用一个函数将它们替换为表前缀。
我编写的函数运行良好,但速度很慢。我想要一个优化的函数(可能是正则表达式或其他解决方案)。
注意:请记住,#__ 不应被替换为引号。
例子:
SELECT p.*, m.member_name, m.member_alias
FROM #__posts AS p
LEFT JOIN #__members AS m ON m.member_id=p.post_author
WHERE p.post_approve = '1' AND p.post_date <= '1438252218'
或
INSERT INTO `#__posts` (`post_title`, `post_text`)
VALUES ('post title (maybe include #__ )' , 'post text. it also can include #__')
我的功能:
protected function replace_prefix($sql, $prefix = '#__')
{
$done = null;
$single = false;
$double = false;
$found = false;
$i = 0;
while (strlen($sql) > 0)
{
if ($sql[$i] == null)
{
return $done.$sql;
}
if (($sql[$i] == "'") && $sql[$i-1] !='\\')
{
$single = !$single;
}
if (($sql[$i] == '"') && $sql[$i-1] !='\\')
{
$double = !$double;
}
if ($sql[$i] == $prefix[0] && !$single && !$double)
{
$found = true;
for ($j=0; $j < strlen($prefix); $j++)
{
if ($sql[$i+$j] != $prefix[$j])
{
$found = false;
break;
}
}
}
if ($found)
{
$done .= substr($sql, 0, $i).$this->prefix;
$sql = substr($sql, $i+$j);
$found = false;
$i = 0;
}
else
{
$i++;
}
if ($i >= strlen($sql))
{
return $done.$sql;
}
}
return $done;
}
【问题讨论】:
-
一个技巧是,而不是逐个字符..只需将所有 "#_ 和 '#_ 替换为临时字符串.. 然后将所有 #_ 替换为您的值,最后替换回 temp '#_ 或 "#_ 的字符串
-
如果它在一个字符串中,例如:“这个 #__ 是前缀”。
-
你能列出所有可能的 $SQL 字符串吗?也许是时候使用正则表达式和切片函数了
-
这是开源类,所以任何人都可以做任何事情
-
您仍然可以将上述技巧与正则表达式和小功能一起使用。我不是 PHP 专家,但这个解决方案应该可以帮助您:stackoverflow.com/a/10524283/1684486 只需使用上述函数将引号内的所有 #_ 替换为临时字符串,然后将所有 #_ 替换为您的值,然后替换回临时字符串