2009-09-06 13 views
5

Moim celem jest zastąpienie linków w bazie danych łączem catchall. I zazwyczaj użyć polecenia REPLACE do zastąpienia znaków w bazie danych, ale tym razem mam trudności, ponieważ w celu znalezienia powiązań muszę używać wyrażeń regularnych, a to nie jest po prostu wypracowanie:Jak korzystać z Regexp w MySQL Wymień polecenia?

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

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

These dwa pytania po prostu spadają płasko.

Co należy zrobić w tej sytuacji?

Odpowiedz

7

Jak już wspomniano, nie można tego zrobić w MySQL. Jednak wydaje się, że jest to jednorazowa operacja, którą musisz wykonać, więc napisałem dla ciebie szybki i brudny skrypt php. Zakłada on, że twoja tabela node_revisions ma kolumnę klucza podstawowego o nazwie "id". Jeśli nie, edytuj odpowiednio. Nie zapomnij również zmienić hosta bazy danych, nazwy użytkownika, hasła i nazwy bazy danych na górze skryptu, aby pasował do konfiguracji.


<?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); 
?> 

Należy również zauważyć, że użyłem nie chciwy modyfikator na wyrażeniach regularnych tak, że jeśli masz wiele adresów URL PDF w polu ciała lub zwiastuna, nie będzie stracić wszystko pomiędzy nimi.

1

zastępuje tekst. W MySQL nie ma zastępowania zwykłego wyrażenia.

6

Krótka odpowiedź: nie można z bazą MySQL.

Długa odpowiedź: this previous SO question, która mówi, że można to zrobić za pomocą UDF (funkcja zdefiniowana przez użytkownika). Wymaga to jednak ponownego zbudowania MySQL, aby zawierał udf.

+0

dzięki za informacyjny link i wyjaśnienie! – picardo

Powiązane problemy