如何在MySQL替换命令中使用正则表达式?

5

我的目标是用一个万能链接替换数据库中的链接。通常我使用REPLACE命令在数据库中替换字符串,但这次我遇到了困难,因为为了找到链接,我需要使用正则表达式,但这并不起作用:

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

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

这两个查询都失败了。在这种情况下需要做什么?
3个回答

7

正如其他人已经提到的,您无法在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,则不会失去它们之间的所有内容。


6

简短回答:你无法使用基本的MySQL实现。

长篇回答:这个之前的SO问题提到,你可以通过UDF(用户定义函数)来实现。然而,这需要重新构建MySQL以包含UDF。


1

REPLACE()函数用于文本替换。MySQL中没有正则表达式替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接