2009-11-10 14 views
10

Tengo que coincidir con un campo en MySQL, para lo cual pensé que podría usar una expresión regular, pero parece que MySQL no tiene la funcionalidad que necesito para hacer el trabajo. Aquí está el escenario:¿Hay un equivalente MySQL de preg_replace de PHP?

Tengo una variable en PHP llamada $ url. Digamos que esta variable se establece como la cadena "/ article/my-article/page/2". También tengo una tabla de URL en MySQL desde la que me gustaría extraer contenido. Las URL almacenadas en mi tabla, sin embargo, incluyen comodines.

Anteriormente, tenía esta configuración para que el valor almacenado en la tabla se viera así: "/ article /%/page /%".

Con esa configuración, tan sólo pudiera correr:

SELECT * FROM urls WHERE '$url' LIKE url 

Y con ello se compararán, que es la funcionalidad deseada.

Lo que me gustaría hacer ahora es permitir un comodín más avanzado, de modo que en lugar de "/ article /%/page /%", mis datos de MySQL podrían ser "/ article/{{slug}}/página/{{page_no}} ".

Quiero crear una consulta SQL que coincida con estos datos, usando la misma entrada $ url. LIKE ya no es la comparación correcta, ya que no estoy usando el comodín incorporado "%", sino más bien {{. *}}. ¿Alguna idea de cómo lograr esto?

Respuesta

-1

He encontrado una solución. No es ideal, pero lo pondré aquí en caso de que nunca surja una solución pura de SQL. Puedo dejar el campo url en MySQL igual a "/ articles /%/page /%" y agregar otro campo llamado variables que almacena una lista de nombres de variables para ser utilizado. De esa forma puedo usar mi consulta original, luego reemplazar los caracteres "%" en el valor de retorno con "{{variable}}" en PHP con sprintf después de recuperar los datos.

Aún así, me gustaría ver esto resuelto en SQL si es posible, ya que creo que el concepto es valioso.

4

Suena como lo que quiere hacer es tener la nueva sintaxis en la base de datos, donde las direcciones URL tienen marcadores de posición que pasaría a su código de reemplazo de variable basado en php (sprintf), pero aún así podrá hacer las comparaciones originales para que coincida con la URL.

si he entendido bien que desea tomar un nuevo formato de URL

/article/{{slug}}/page/{{page_no}} 

y compararlo con algo así como

/article/my-article/page/2 

El preg plugin de Sagi mencionado puede hacer la sustitución que necesita, lo que hará convierta una de sus URL recientemente formateadas en el formato original que utilizó para determinar la coincidencia utilizando la sintaxis LIKE.La siguiente consulta:

SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls; 

convertiría a la nueva URL (/ artículo/{{babosa}}/página/{{page_no}}) en lo que era originalmente

/article/%/page/% 

el cual puede ser entonces realimenta a través de su búsqueda original, algo como esto:

SELECT * FROM urls 
WHERE '/article/my-article/page/2' LIKE preg_replace('/({{.*?}})/', '%', `url`); 

Algunas distribuciones binarias como MAMP, XAMMP etc tienen el plugin ya instalado, pero no está instalado en una gran cantidad de sistemas como MacPorts/Ubuntu. Aquí hay un par de artículos sobre cómo instalar el plugin preg. Espero eso ayude.

http://quickshiftin.com/blog/2011/04/installing-mysql-preg-plugin-osx-macports/

http://quickshiftin.com/blog/2011/12/installing-the-mysql-preg-plugin-on-ubuntu-with-apt-get/

+1

Esta es la respuesta correcta. – dotancohen

3

El usuario Sagi anterior menciona http://www.mysqludf.org/lib_mysqludf_preg/ pero a medida que esta respuesta es muy antigua como la mayoría de los tutoriales, quería ampliar esto por el bien de los recién llegados a esta pregunta .

En primer lugar, la biblioteca es muy grande y hablando por experiencia puedo decir que parece que se ha mantenido y sigue funcionando sin problemas en 2015.

Para conseguirlo instalado y funcionando, sólo pude encontrar algunos muy viejo tutoriales así que pensé que iba a compartir lo que hacía que trabajó para mí instalar última versión estable (v1.1) en Ubuntu 14.04:

apt-get update 
apt-get install libpcre3-dev libmysqlclient-dev build-essential libmysqld-dev libpcre3-dev 
wget https://github.com/mysqludf/lib_mysqludf_preg/archive/lib_mysqludf_preg-1.1.tar.gz 
tar -xzf lib_mysqludf_preg-1.1.tar.gz 
cd lib_mysqludf_preg-1.1 
./configure 
make install 
make installdb 
service mysql restart 

ahora debe tener todas las siguientes funciones disponibles:

lib_mysqludf_preg_info 
preg_capture 
preg_check 
preg_replace 
preg_rlike 
preg_position 
+0

También hay un conjunto bastante bueno de instrucciones de instalación en el documento github INSTALL en https://github.com/mysqludf/lib_mysqludf_preg/blob/testing/INSTALL – Slam

0

A partir de MySQL 5.5, puede utilizar RLIKE:

  • cualquiera de las tiendas url en REGEXP de estilo, y para consultar con

    SELECT * FROM URL cuyo '$ url' RLIKE url;

  • o mantenerlo en perfectas estilo, y hacer un reemplazo (% en *, _ por..):

    SELECT * FROM URL cuyo '$ url' RLIKE REPLACE (SUSTITUIR (url, ' % ','. * '),' _ ','. ');

    Para completar, tendría que hacer otras sustituciones para escapar de los caracteres que son significativos para la regularidad:? \() [] ... (vea la función php preg_quote)

Cuestiones relacionadas