[英]How to use the following Regexp to run as a replace/update sql query in Mysql
[英]How to Use Regexp in MySQL Replace Commands?
我的目标是用一个catchall链接替换数据库中的链接。 我通常使用REPLACE命令替换数据库中的字符串,但这次我遇到了困难,因为为了找到我需要使用正则表达式的链接,这根本就没有用完:
UPDATE node_revisions SET body = REPLACE ( `body` , 'http://.*.\pdf', '/migration-update' );
UPDATE node_revisions SET teaser = REPLACE ( `teaser` , 'http://.*pdf', '/migration-update' );
这两个问题只是平淡无奇。
在这种情况下需要做些什么?
正如其他人已经提到的那样,你不能在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网址,则不会丢失它们之间的所有内容。
简短的回答:你不能用基础MySQL。
答案很长: 这个以前的SO问题 ,提到你可以用UDF(用户定义的函数)来做。 但是,这需要重新构建MySQL以包含udf。
REPLACE()
文本替换。 MySQL中没有正则表达式替换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.