【问题标题】:How to Use Regexp in MySQL Replace Commands?如何在 MySQL 替换命令中使用正则表达式?
【发布时间】:2010-11-25 23:14:27
【问题描述】:

我的目标是用一个包罗万象的链接替换数据库中的链接。我通常使用 REPLACE 命令来替换数据库中的字符串,但这次我遇到了困难,因为为了找到链接,我需要使用正则表达式,而这根本行不通:

UPDATE node_revisions SET body = REPLACE ( `body` , 'http://.*.\pdf', '/migration-update' );

UPDATE node_revisions SET teaser = REPLACE ( `teaser` ,  'http://.*pdf', '/migration-update' );

这两个查询只是平淡无奇。

在这种情况下需要做什么?

【问题讨论】:

    标签: mysql regex replace


    【解决方案1】:

    正如其他人已经提到的,您不能在 MySQL 中执行此操作。但是,这似乎是您需要执行的一次性操作,因此我为您编写了一个快速而肮脏的小 php 脚本来完成这项工作。它假定您的 node_revisions 表有一个名为“id”的主键列。如果没有,请适当编辑。另外,不要忘记更改脚本顶部的数据库主机、用户名、密码和数据库名称以匹配您的配置。

    
    <?php
    $host = '127.0.0.1';
    $username = 'root';
    $password = 'password';
    $database = 'test';
    
    $conn = mysql_connect($host, $username, $password);
    
    if (!$conn) {
        echo "Unable to connect to DB: " . mysql_error();
        exit;
    }
    
    if (!mysql_select_db($database)) {
        echo "Unable to select " . $database . ": " . mysql_error();
        exit;
    }
    
    $sql = "SELECT * FROM node_revisions";
    
    $result = mysql_query($sql);
    
    if (!$result) {
        echo "Could not successfully run query ($sql) from DB: " . mysql_error();
        exit;
    }
    
    if (mysql_num_rows($result) == 0) {
        echo "No rows found, nothing to print so am exiting";
        exit;
    }
    
    while ($row = mysql_fetch_assoc($result)) {
        $id = $row['id'];
        $body = $row['body'];
        $teaser = $row['teaser'];
        $body = preg_replace('/http:\/\/.*?\.pdf/', '/migration-update', $body);
        $teaser = preg_replace('/http:\/\/.*?\.pdf/', '/migration-update', $teaser);
        $sql = "UPDATE node_revisions set body='" . mysql_real_escape_string($body) . "', teaser='" . mysql_real_escape_string($teaser) . "' where id=" . $id;
        mysql_query($sql);
    }
    
    mysql_free_result($result);
    mysql_close($conn);
    ?>
    

    还请注意,我在正则表达式上使用了非贪婪修饰符,因此如果您在正文或预告片字段中有多个 pdf url,您不会丢失它们之间的所有内容。

    【讨论】:

      【解决方案2】:

      简短的回答:你不能使用基础 MySQL。

      长答案:this previous SO question,其中提到您可以使用 UDF(用户定义的函数)来完成。但是,这需要重新构建 MySQL 以包含 udf。

      【讨论】:

        【解决方案3】:

        REPLACE() 进行文本替换。 MySQL 中没有正则表达式替换。

        【讨论】:

          猜你喜欢
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          • 2011-03-10
          • 2010-11-02
          相关资源
          最近更新 更多