MySQL - 从内容列内的 href 属性中的动态 url 搜索并替换文本 (".html")
MySQL - Search and replace text (".html") from dynamic url's that exists in href attributes, inside content columns
我正在尝试使用正则表达式引用创建一个 MySQL 查询,以更正我博客中的数据输入错误。具体来说,我需要在我的文章中找到一些 href 值以“.html”(包括点)结尾的 内部链接 并删除错误的部分。这些链接应该没有 .html 扩展名。当然不是那么简单
问题:我有很多外部链接也以这个扩展结束(.html),我根本不想改变。我只想更改一些以 .html 结尾的内部链接。这些链接也是相对的。所以查询必须更复杂才能找到这些链接内容(大约 6000 篇文章)。
好的部分是我需要搜索的这些链接已经有一个模式。这是一个例子index.php?option=com_k2&view=item&id=6238:alias-title-of-an-article.html
(是的,它是一个带有K2的Joomla安装)
所以我的第一个想法是创建一个带有 2 个条件的查询。 A) 搜索 href 值以 index.php?option=com_k2&view=item&id=
开头的所有链接,并删除它的结尾部分 .html
(如果存在)。到目前为止,我已经设法做到了:
REGEX 参考: href="index\.php\?option=com_k2.*?(?=")
MySQL 查询: UPDATE 'qc95t_k2_items' SET 'introtext' = REPLACE('introtext', '.html', '') WHERE 'catid'=84 AND 'introtext' LIKE '%href="index\.php\?option=com_k2.*?(?=")%';
除了这个查询是 100% 错误的事实之外,因为它将 select 所有与 .html
的引用,它也返回 0 个结果,因为它找不到任何东西。同样在下面的这个例子中,我的正则表达式引用正在工作(我认为)除了 "ends with .html" 条件。
非常感谢你的帮助。
最后,我自己想出了一个解决方法。由于直接通过 MySQL 查询创建带有正则表达式替换 (REPLACE + REGEXP) 的复杂查询几乎是不可能的,因此我找到的解决方案是:
- 只需下载(导出)特定的 table (table.sql)
- 用Notepad++编辑器打开
- 创建一个匹配 2 组字符串的正则表达式。第一组将包含 url 部分直到“.html”(在本例中为
"index.php?option=com_k2&view=item&id=6238:alias-title-of-an-article
),第二组将仅包含您想要的部分已删除(在本例中为 .html
)
- 使用 Notepad++ 添加以下正则表达式命令进行搜索和替换
搜索: ([^href="]*"index\.php\?option=com_k2&view=item&id=\d{2,4}:[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*[\w\-]*)\.html
替换为: </code></p>
<ol start="5">
<li>保存并上传您的 table 回您的数据库</li>
</ol>
<p>上面的 Regex 命令(搜索字段)将 url 分组,除了“.html”部分,并且在替换 (<code>
) 时它告诉记事本替换所有但保留第一组是正确的 url,没有 .html
。这完全有效(已测试),就我而言,我已经清理了 658 urls。您可以在下面找到正在运行的正则表达式:
我正在尝试使用正则表达式引用创建一个 MySQL 查询,以更正我博客中的数据输入错误。具体来说,我需要在我的文章中找到一些 href 值以“.html”(包括点)结尾的 内部链接 并删除错误的部分。这些链接应该没有 .html 扩展名。当然不是那么简单
问题:我有很多外部链接也以这个扩展结束(.html),我根本不想改变。我只想更改一些以 .html 结尾的内部链接。这些链接也是相对的。所以查询必须更复杂才能找到这些链接内容(大约 6000 篇文章)。
好的部分是我需要搜索的这些链接已经有一个模式。这是一个例子index.php?option=com_k2&view=item&id=6238:alias-title-of-an-article.html
(是的,它是一个带有K2的Joomla安装)
所以我的第一个想法是创建一个带有 2 个条件的查询。 A) 搜索 href 值以 index.php?option=com_k2&view=item&id=
开头的所有链接,并删除它的结尾部分 .html
(如果存在)。到目前为止,我已经设法做到了:
REGEX 参考: href="index\.php\?option=com_k2.*?(?=")
MySQL 查询: UPDATE 'qc95t_k2_items' SET 'introtext' = REPLACE('introtext', '.html', '') WHERE 'catid'=84 AND 'introtext' LIKE '%href="index\.php\?option=com_k2.*?(?=")%';
除了这个查询是 100% 错误的事实之外,因为它将 select 所有与 .html
的引用,它也返回 0 个结果,因为它找不到任何东西。同样在下面的这个例子中,我的正则表达式引用正在工作(我认为)除了 "ends with .html" 条件。
非常感谢你的帮助。
最后,我自己想出了一个解决方法。由于直接通过 MySQL 查询创建带有正则表达式替换 (REPLACE + REGEXP) 的复杂查询几乎是不可能的,因此我找到的解决方案是:
- 只需下载(导出)特定的 table (table.sql)
- 用Notepad++编辑器打开
- 创建一个匹配 2 组字符串的正则表达式。第一组将包含 url 部分直到“.html”(在本例中为
"index.php?option=com_k2&view=item&id=6238:alias-title-of-an-article
),第二组将仅包含您想要的部分已删除(在本例中为.html
) - 使用 Notepad++ 添加以下正则表达式命令进行搜索和替换
搜索: ([^href="]*"index\.php\?option=com_k2&view=item&id=\d{2,4}:[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*[\w\-]*)\.html
替换为: </code></p>
<ol start="5">
<li>保存并上传您的 table 回您的数据库</li>
</ol>
<p>上面的 Regex 命令(搜索字段)将 url 分组,除了“.html”部分,并且在替换 (<code>
) 时它告诉记事本替换所有但保留第一组是正确的 url,没有 .html
。这完全有效(已测试),就我而言,我已经清理了 658 urls。您可以在下面找到正在运行的正则表达式: