2015-03-12 3 views
3

Мне нужно вычеркнуть URL-адреса из результатов SQL-запроса. Все URL-адреса выглядят как http://, поэтому не требуется сложное регулярное выражение. Но URL-адреса могут быть в любом месте строки.Как я могу удалить URL-адреса из строки в MySQL?

Примеры:

alpha beta http://alphabeta.com/abc 
gamma http://gammadel.com/def delta 
http://epsilo.com/ghi epsilon theta 

Как может лишить эти адреса из моих результатов, чтобы получить следующее?

alpha beta 
gamma delta 
epsilon theta 

Примечания:

  1. URL (в моем случае использования) сделать всегда начинаются с http://.
  2. только один URL найден в строку
  3. решения
  4. идеала не требует дополнительных библиотек
+0

Есть только один URL в каждой строке или может быть несколько ссылок? –

+0

Хороший вопрос. Только одна строка. Я добавлю это к вопросу. – Ryan

ответ

2

насчет

SELECT REPLACE(
    'alpha gamma http://gammadel.com/def delta beta', 
    CONCAT('http://', 
    SUBSTRING_INDEX(
     SUBSTRING_INDEX('alpha gamma http://gammadel.com/def delta beta', 'http://', -1),' ', 1) 
),'' 
); 

Я проверил это для строк, которые вы указали, но не уверен, если он удовлетворяет полностью требованиям.

В основном то, что делает этот код является:

  1. экстракт URL с SUBSTRING_INDEX() функцией
  2. заменить URL с пустой строкой в ​​исходной строке.

Вот полный запрос для проверки каждого сценария:

SET @str1="foo bar http://foobar.com/abc"; 
SET @str2="foo http://foobar.com/def bar"; 
SET @str3="http://foobar.com/ghi foo bar"; 
SELECT 
    REPLACE(
     @str1, 
     CONCAT('http://', 
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(@str1, 'http://', -1), 
       ' ', 1 
      ) 
     ),'' 
    ) AS str1, 
    REPLACE(
     @str2, 
     CONCAT('http://', 
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(@str2, 'http://', -1), 
       ' ', 1 
      ) 
     ),'' 
    ) AS str2, 
    REPLACE(
     @str3, 
     CONCAT('http://', 
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(@str3, 'http://', -1), 
       ' ', 1 
      ) 
     ),'' 
    ) AS str3 
; 

Возвращает (как и ожидалось):

foo bar 
foo bar 
foo bar 
+1

Это хорошая альтернатива решению, которое я предоставил, поскольку оно решает проблему без установки библиотеки, которую OP идеально не хотел делать.** + 1 ** –

+0

Это именно то, на что я надеялся! Отлично сработано. Добавлен мой тестовый запрос, чтобы увидеть все это в действии. Благодарю. – Ryan

2

Как вы не можете использовать такие функции, как preg_replace без каких-либо аддонов/библиотеки - и, как вы пометили только вопрос с mysql/sql, вам понадобится установить это, чтобы вы могли использовать замену регулярного выражения. https://github.com/mysqludf/lib_mysqludf_preg#readme

Теперь, когда установлено, вы можете запускать;

SELECT CONVERT( 
    preg_replace('/(http:\/\/[^ \s]+)/i', '', foo) 
USING UTF8) AS result 
FROM `bar`; 

Это даст результаты, как: https://regex101.com/r/qX6jB8/1

+1

Хммм ... Так что невозможно лишить подстроку от 'http: // до конца или следующей позиции пространства? – Ryan

+0

Если вы не используете кучу функций, чтобы получить строковые позиции, то * возможно *. Кроме того, вы можете удалить URL-адреса, прежде чем отображать их у своего конечного пользователя после их получения из базы данных. –

+2

Хмммм. +1 для чего-то нового для меня :) – Avidan

Смежные вопросы