2011-06-18 45 views
1

在我的論壇中,我有一個BB代碼來顯示youtube視頻。 下列選項可用於提取YouTube視頻的代碼,並使用此代碼來構建嵌入代碼:在MYSQL中使用REGEXP替換子串

[youtube]http://www.youtube.com/watch?v=_OBlgSz8sSM&feature=related[/youtube] 
[youtube]http://www.youtube.com/watch?v=_OBlgSz8sSM[/youtube] 
[youtube]_OBlgSz8sSM[/youtube] 

所有這些選項返回YouTube視頻代碼__OBlgSz8sSM

升級到論壇的第一個新版本後兩個選項解析youtube鏈接不工作,只有[youtube] _OBlgSz8sSM [/ youtube]的最後一個選項是可行的。

這些BB代碼是論壇帖子的一部分,不在數據庫的單獨字段中。

我的目標是,以取代與[YouTube的]開始,以[/ YouTube的]包含?V截止所有子串=與

[youtube]11 characters from ?v=[/youtube] 

我使用的MySQL 表名是POST 字段名包含這些BB代碼是PAGETEXT

您能否幫助我構建此更新。

+0

我不認爲mySQL能夠做到這一點 - 據我所知,其正則表達式僅用於選擇,而不是替代。你不能用PHP或其他東西來做實際的替換嗎? –

+0

在之前版本的論壇中,它是一個模塊,它進行了這種解析。這個模塊在新版本中不可用,我不是程序員來編寫這個模塊。 – Igal

回答

2

編輯:前答案顯然是錯誤的。

不使用正則表達式:

UPDATE POST SET PAGETEXT = REPLACE(PAGETEXT, '[youtube]http://www.youtube.com/watch?v=', '[youtube]'); 
UPDATE POST SET PAGETEXT = REPLACE(PAGETEXT, '[youtube]www.youtube.com/watch?v=', '[youtube]'); 
UPDATE POST SET PAGETEXT = REPLACE(PAGETEXT, '[youtube]youtube.com/watch?v=', '[youtube]'); 
UPDATE POST SET PAGETEXT = REPLACE(PAGETEXT, '&feature=related[/youtube]', '[/youtube]'); 

這將刪除你不想要的數據通過直接搜索和替換。有沒有其他原始文章中沒有列出的模式/格式?

使用測試數據:

SET @test = 'test [youtube]youtube.com/watch?v=_OBlgSz8sSM&feature=related[/youtube] test'; 
SET @test = REPLACE(@test, '[youtube]http://www.youtube.com/watch?v=', '[youtube]'); 
SET @test = REPLACE(@test, '[youtube]www.youtube.com/watch?v=', '[youtube]'); 
SET @test = REPLACE(@test, '[youtube]youtube.com/watch?v=', '[youtube]'); 
SET @test = REPLACE(@test, '&feature=related[/youtube]', '[/youtube]'); 
SELECT @test; 

mysql> SELECT @test; 
+------------------------------------------+ 
| @test         | 
+------------------------------------------+ 
| test [youtube]_OBlgSz8sSM[/youtube] test | 
+------------------------------------------+ 

運行這四個之後,它們也同樣吸引運行

SELECT COUNT(*) FROM POST WHERE PAGETEXT LIKE '%?v=%'; 

,然後確保如果有其他任何需要處理。

總是先測試一下。

+0

@leon,謝謝你的回覆。我申請之後恐怕將[youtube] http://www.youtube.com/watch?v=_OBlgSz8sSM [/ youtube]更改爲[youtube] http://www.youtube.com/watch [youtube] _OBlgSz8sSM [/ youtube] = _ OBlgSz8sSM [/ youtube]因爲您只更改了?v =而不是所有從[youtube]開始並以[/ youtube]結尾的字符串 – Igal

+0

@Igal,否則不會。更新的工作原理是這樣的:(1)選擇分隔符後面的所有字符(在本例中,?v =),因此它使用_OBlgSz8sSM&feature = related [/ youtube],然後(2)獲得FIRST 11個字符,然後使用_OBlgSz8sSM 3)prepend [youtube]並將[/ youtube]追加到第1步和第2步中使用的字符串中。;-) – leon

+0

@leon,我測試了您的建議。它替換了列中的所有文本,不僅從[youtube]到[/ youtube] – Igal