MySQL替换给定域的.html链接

时间:2016-07-23 12:42:23

标签: mysql sql

在我的数据库中,存在包含大量内部链接的contenfields。我必须将链接结构从www.mydomain.de/page.html更改为www.mydomain.de/page/,但替换语句应尊重域名:

预计这将被取代:

www.mydomain.de/somepage.html -> www.mydomain.de/page/
www.mydomain.de/subfolder/page.html -> www.mydomain.de/subfolder/page/
www.mydomain.de/link.html?param=1 -> www.mydomain.de/page/?param=1
www.mydomain.de/another-link.html#hash -> www.mydomain.de/page/#hash

所有其他链接应该不受影响,这里有一些示例,但可以是网络上的任何链接:

 www.some-domain.de/link.html    
 www.another-domain.com/somelink.html

在一个内容字段中可以有不同的链接:

<p>If you want to read more, click 
<a href="http://www.mydomain.de/page.html">here</a> 
or there <a href="http://www.another-domain.com/somelink.html">there</a>

这是替换:

UPDATE tablename 
SET contentfield = REPLACE(contentfield, '.html', '/') 

我的想法(但不知道如何为他们创建声明):

  • 找到前100个字符中的位置&m; 39. mydomain.de&#39;
  • &#34; .html&#34;的数量found =&#34; mydomain.de&#34;结果

不必100%匹配所有&#39; mydomain.de&#39;链接,我很满意90%,但外部链接不应该有错误的替换。

4 个答案:

答案 0 :(得分:2)

这样做你想要的吗?

UPDATE tablename 
    SET contentfield = REPLACE(contentfield, '.html', '/') 
    WHERE contentfield like 'www.mydomain.de/%';

它应该适用于问题中的示例。

如果您愿意,可以使用条件仅匹配实际具有&#34; .html&#34;的行。在他们中间。

    WHERE contentfield like 'www.mydomain.de/%.html%'

答案 1 :(得分:2)

更新:现在已将其发布到博文中:http://stevettt.blogspot.co.uk/2018/02/a-mysql-regular-expression-replace.html

请参阅以下Rextester小提琴,我认为应该提供您要求的所有结果:

Rextester Demo

<强>解释

需要使用模式替换功能,但不幸的是MySQL doesn't provide such a thing。所以我写了一篇(基于另一篇文章还不够)并发布了here。如引用的答案中所述,此功能具有不允许用反向引用替换捕获组的限制。因此,它在小提琴中稍微适应了进一步的参数,允许它在找到的替换匹配中执行递归替换。 (请注意,根据this excellent answer在正则表达式中使用允许的URL路径字符。)

更新SQL

以下SQL将使用以下函数更新表数据:

if(isIE11) {
 isBolded = yourDocumentHere.queryCommandValue('bold');
 if(isBolded) {
   yourDocumentHere.execCommand('removeFormat', false)
 }
}

功能代码

演示中使用的UDF代码也发布在下面。注意:UDF从only stored procedures will allow recursion in MySQL开始委托存储过程。

UPDATE urls
SET url = reg_replace(
  url,
  'www\\.mydomain\\.de/[-A-Za-z0-9\\._~!\\$&''\\(\\)\\*\\+,;=:@%/]+\\.html',
  '/[^/]+\\.html',
  '/page/',
  TRUE,
  22, -- Min match length = www.mydomain.de/?.html = 22
  0,  -- No max match length
  7,  -- Min sub-match length = /?.html = 7
  0   -- No max sub-match length
  );

答案 2 :(得分:1)

我只是将表导出为CSV或其他东西,然后使用notepad ++ / excel / etc.内部工具替换
&#39; html的&#39;与&#39; /&#39;。

然后导回到SQL。

此外,由于mysql支持正则表达式,因此您可以搜索包含.html的域名。

 mydomain.de[^s]+.html

答案 3 :(得分:0)

你可以使用

 UPDATE tablename 
 SET contentfield = REPLACE(contentfield, '.html', '/') 
 where contentfield  like 'www.mydomain.de%' 
 AND contentfield  like '%html%'
 AND ( contentfield  not like 'www.another-domain.com/somelink%'  OR  
         contentfield  not like 'www.another-domain.com/subfolder/link%' )