在我的数据库中,存在包含大量内部链接的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%匹配所有&#39; mydomain.de&#39;链接,我很满意90%,但外部链接不应该有错误的替换。
答案 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小提琴,我认为应该提供您要求的所有结果:
<强>解释强>
需要使用模式替换功能,但不幸的是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%' )