2009-09-06 13 views
5

Mi objetivo es reemplazar los enlaces en la base de datos con un enlace de búsqueda. Yo generalmente uso el comando Reemplazar para reemplazar cadena en la base de datos, pero esta vez estoy teniendo dificultades, porque a fin de encontrar los enlaces que necesito para utilizar expresiones regulares, y que simplemente no está funcionando:Cómo usar Regexp en MySQL Reemplazar comandos?

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

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

Estos dos consultas simplemente se caen.

¿Qué hay que hacer aquí en esta situación?

Respuesta

7

Como ya se ha mencionado, no se puede hacer esto en MySQL. Sin embargo, esto parece ser una operación de una sola vez que necesita hacer, así que le escribí un pequeño y rápido script php para hacer el trabajo. Asume que su tabla node_revisions tiene una columna de clave principal llamada 'id'. Si no, edita apropiadamente. Además, no olvide cambiar el nombre de la base de datos, el nombre de usuario, la contraseña y el nombre de la base de datos en la parte superior de la secuencia de comandos para que coincida con su configuración.


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

Tenga en cuenta también que utiliza un modificador no expansivo sobre las expresiones regulares, de modo que si tiene varias direcciones URL pdf en un campo del cuerpo o sumario, no perderá todo entre ellos.

1

REPLACE() realiza el reemplazo del texto. No hay reemplazo de expresiones regulares en MySQL.

6

Respuesta corta: no se puede con base MySQL.

Respuesta larga: this previous SO question, que menciona que puede hacerlo con una UDF (función definida por el usuario). Sin embargo, esto requiere reconstruir MySQL para incluir el udf.

+0

¡gracias por el enlace informativo y la explicación! – picardo

Cuestiones relacionadas