簡體   English   中英

如何在MySQL中使用Regexp替換命令?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM