【问题标题】:PHP replace dots within backticksPHP替换反引号内的点
【发布时间】:2017-09-29 07:37:50
【问题描述】:

我有一个项目,我需要修改数据库中很多表的表名,因此需要修改很多 SQL 查询。

现在我的表都有 1.customers、2.customers 等名称 我需要将这些更新为 1_customer、2_customers 等。

是否可以通过 preg_replace 将反引号中的所有点替换为下划线

例如我想要

"UPDATE `1.customers` SET `value` = '1.0'"

成为

"UPDATE `1_customers` SET `value` = '1.0'"

总共大约有 50 张桌子。

【问题讨论】:

  • 我们在讨论多少张桌子?而且您不能只是preg_replace,因为您的表已经命名。做preg_replace 只会改变查询的外观。在更改它们时,您实际上需要更改它们的名称。
  • 一个好的 ide 的查找和替换会更安全
  • 大约 50 张桌子。
  • 我意识到正确的解决方案是更新代码,我打算这样做,我正在寻找一个临时措施,同时我正在这样做。
  • 此答案可能对stackoverflow.com/a/10490243/1415724 有所帮助或为您指明正确的方向。它是mysql_,但可以轻松修改。

标签: php sql rename batch-processing


【解决方案1】:

将反引号内的所有点替换为下划线

$input = "UPDATE `1.customers` SET `value` = '1.0'";

$output = preg_replace_callback(
  '/`(.+?)`/',
  function ($matches) {
    return str_replace('.', '_', $matches[0]);
  },
  $input
);

$输出

UPDATE `1_customers` SET `value` = '1.0'

【讨论】:

    【解决方案2】:

    在正则表达式中使用捕获组来匹配点之前和之后的部分,这样你就可以将它们复制到替换中。

    $str = preg_replace_callback('/(`\d+)\.(\w+`)/', '$1_$2', $str);
    

    这假设每个名称中只有一个点。如果没有,可以使用preg_replace_callback()匹配任意个点的名称,然后在回调函数中使用str_replace()将所有点替换为下划线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多