2009-09-06 25 views
5

我的目標是用catchall鏈接替換數據庫中的鏈接。我一般用在數據庫中替換字符串替換命令,但是這一次,我因爲要找到我需要使用正則表達式的聯繫有困難,而且根本就沒有工作了:如何在MySQL中使用Regexp替換命令?

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

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

這些兩個查詢只是平坦。

在這種情況下需要做些什麼?

回答

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的網址,你會不會在它們之間血本無歸。

6

簡短的回答:你不能使用基本的MySQL。

長答案:this previous SO question,其中提到你可以用UDF(用戶定義的函數)來做到這一點。但是,這需要重新構建MySQL以包含udf。

+0

感謝您提供豐富的鏈接和解釋! – picardo 2009-09-06 06:09:46