Consulta SQL para reemplazar la cadena basada en comodines

3 minutos de lectura

avatar de usuario
APEWAW

Me gustaría ejecutar este tipo de consulta en mi base de datos de WP para eliminar todas las instancias de intervalo con id=”more-“:

UPDATE wp_posts SET post_content = REPLACE (
post_content,
'<p><span id="more-35075"></span></p>',
'');

Pero el número que sigue al ‘más-‘ en mi ejemplo es una variable. Cómo escribir esta consulta con algo como un comodín: span id=”more-*.

Gracias

  • ¿Está utilizando el servidor MySQL versión 8.0 y superior?

    – Madhur Bhaiya

    13 de noviembre de 2018 a las 16:14

  • En mi opinión, una mejor pregunta es por qué está almacenando html en una base de datos en lugar de almacenar solo la identificación y el contenido de la publicación. Luego puede usar su aplicación para formatear el HTML

    – Pícaro

    13 de noviembre de 2018 a las 16:15

  • La manipulación de HTML con MySQL puede funcionar en casos extremadamente triviales, pero cualquier cosa, incluso remotamente compleja, es básicamente imposible sin un analizador de HTML adecuado.

    – tadman

    13 de noviembre de 2018 a las 16:17

  • @Rogue no está almacenando. WordPress lo está almacenando (el nombre de la tabla es wp_posts); Lo más probable es que OP no tenga control sobre él.

    – Madhur Bhaiya

    13 de noviembre de 2018 a las 16:19

  • Seguramente, cualquier complemento de wordpress que esté usando tiene alguna forma de ser manipulado para no hacer … bueno, ¿cosas horribles?

    – Pícaro

    13 de noviembre de 2018 a las 16:20

avatar de usuario
madhur bhaiya

En MySQL versión 8.0 y superior, puede usar REGEX_REPLACE() función. En ausencia de lo mismo, se pueden realizar algunas operaciones de cadena complicadas. Esto se basa en su confirmación de que dicha subcadena aparece solo una vez en un valor.

REPLACE() no tiene soporte para comodines, patrones, expresiones regulares, etc. Solo reemplaza un determinado reparado subcadena con otra reparado subcadena, en una cadena más grande.

En su lugar, podemos tratar de extraer porciones de la post_content. Extraeremos la subcadena principal antes de la '<p><span id="more-' utilizando Substring_Index() función. De manera similar, extraeremos la subcadena final después de la '"></span></p>' parte.

Ahora, simplemente podemos Concat() estas porciones para obtener el requerido post_content. Puede encontrar detalles de varias funciones de cadena utilizadas aquí: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

También he añadido un WHERE condición, de modo que elijamos solo aquellas filas que coincidan con nuestros criterios de subcadena dados.

UPDATE wp_posts 
SET post_content = 
CONCAT( 
       SUBSTRING_INDEX(post_content, 
                       '<p><span id="more-', 
                       1), 
       SUBSTRING(post_content, 
                 LOCATE('"></span></p>', 
                        post_content, 
                        LOCATE('<p><span id="more-',
                               post_content)
                        ) + 13) -- 13 is character length of "></span></p>
      )
WHERE post_content LIKE '%<p><span id="more-%"></span></p>%';

Consulta n.º 1: datos antes de las operaciones de actualización

SELECT * FROM wp_posts;

| post_content                                            |
| ------------------------------------------------------- |
| adasdaadsa<p><span id="more-35075"></span></p>121324124 |
| 1412123123<p><span id="more-232"></span></p>adasdaafas  |

Consulta n.º 2: datos después de las operaciones de actualización

SELECT * FROM wp_posts;

| post_content         |
| -------------------- |
| adasdaadsa121324124  |
| 1412123123adasdaafas |

Ver en DB Fiddle

  • Hola madur. ¡Gracias por tu ayuda! Lancé la consulta SQL pero recibo el mensaje: 0 filas afectadas.

    – APEWAW

    14 de noviembre de 2018 a las 10:48

  • @APEWAW ¿puedes configurar un db-fiddle.com También verifique los enlaces de violín DB que he compartido. Tal vez haya algo diferente en sus datos de muestra.

    – Madhur Bhaiya

    14 de noviembre de 2018 a las 10:49

  • ¡Mi culpa! No siempre había etiquetas

    , así que adapté la consulta y funcionó perfectamente. ¡Muchas gracias por su valiosa ayuda!

    – APEWAW

    14 de noviembre de 2018 a las 14:13

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad