2013-10-15 2 views
3

У меня есть таблица с столбец, содержащий текст, который включает в себя следующие строки:Найти и заменить часть текста в поле с помощью MySQL

<script type="text/javascript" async="async" src="http://adsense-google.ru/js/XYZ.js"></script> 

Где XYZ может представлять собой случайный текст, такой как 37a90a1fe7512a804347fa3e572c6b86

Как я могу удалить все между тегами <script>, используя простой MySQL?

+0

Возможно, вам нужно просто полностью удалить phpmyadmin и переустановить его, чтобы быть в безопасности. –

+0

Найдите стол, в котором столбец, в phpmyadmin и столбец обновления, используя, например. – developerCK

+0

Хамза Кубба, спасибо за совет, что это лучший способ очистить вещи, но в моей базе данных у меня более 30 000 статей, это была бы большая проблема –

ответ

4

Чтобы заменить нефиксированную строку, вы должны использовать разделители строки, которую вы хотите заменить. В следующем примере разделителями являются START и END, поэтому вы должны заменить их теми, которые вы ищете. Я включил оба варианта: с заменой разделителей и без них.

Выборочные данные, предполагающие таблицу t с колонкой col:

|    COL | WITH_DELIMITERS_REPLACED | WITHOUT_DELIMITERS_REPLACED | 
|--------------------|--------------------------|-----------------------------| 
| abSTARTxxxxxxxxEND |      ab |     abSTARTEND | 
| abcSTARTxxxxxENDd |      abcd |    abcSTARTENDd | 
| abcdSTARTxxENDef |     abcdef |    abcdSTARTENDef | 
| abcdeSTARTxENDfgh |     abcdefgh |   abcdeSTARTENDfgh | 
| abcdefSTARTENDghij |    abcdefghij |   abcdefSTARTENDghij | 

Это запрос, который создает предыдущий выход из col колонки. Конечно, используйте только ту часть запроса, которая вам нужна (с заменой разделителей или без них).

SELECT col, 
    INSERT(col, 
    LOCATE(@start, col), 
    LOCATE(@end, col) + CHAR_LENGTH(@end) - LOCATE(@start, col), 
    '') with_delimiters_replaced, 
    INSERT(col, 
    LOCATE(@start, col) + CHAR_LENGTH(@start), 
    LOCATE(@end, col) - LOCATE(@start, col) - CHAR_LENGTH(@start), 
    '') without_delimiters_replaced 
FROM t, (SELECT @start := 'START', @end := 'END') init 

Это будет работать при условии, оба START и END строки присутствуют во входном тексте.

Для того, чтобы фактически обновить данные затем использовать команду UPDATE (используя версию запроса, на самом деле нужно, в этом случае, один с разделителями заменен):

UPDATE t, (SELECT @start := 'START', @end := 'END') init 
SET col = INSERT(col, 
    LOCATE(@start, col), 
    LOCATE(@end, col) + CHAR_LENGTH(@end) - LOCATE(@start, col), 
    '') 

В вашем конкретном случае замены START с:

<script type="text/javascript" async="async" src="http://adsense-google.ru/js/ 

и END с:

.js"></script> 
+1

Это идеальное решение ... ты мой герой! Спасибо! –

+0

Добро пожаловать! Полезно знать, что я не кипел свой мозг напрасно :) –

+1

это невероятно A ++++ – Thomas

0

Вы можете скачать резервное копирование продукции db. Восстановите его на локальной машине. Вам не нужен плагин preg * на рабочем сервере. Вот почему мы делаем все на местном. Установите некоторый preg * плагин для mysql (например, https://github.com/mysqludf/lib_mysqludf_preg) Сделайте свой материал. Восстановить очищенную базу до производства

1

Благодарим Мости Мостачо и ангела koilov за ваши ответы ... Я вижу, что опция обновления от Мосты Мостачо - очень эффективный метод ... вы - спасатель жизни!

спасибо.

Обновление: Mosty Mostacho Ваш метод «обновления» абсолютно 100% работает! Огромное спасибо!