用于在内容迁移后更新 URL 的正则表达式

Regex to update URLs after a content migration

我最近将一些旧内容移到了新站点并更新了一些 URL 结构。我需要对整个数据库执行 find-replace 以更新一些旧链接。如果我知道正则表达式,这会很容易,但我不希望这对 SO 大师来说很容易。

注意:这是 PHP 正则表达式。

查找:

https://api.floodmagazine.com/{number}/{string}/
Result:
https://api.floodmagazine.com/789/foo-bar/
https://api.floodmagazine.com/12345/foo-bar-1/

替换为:

https://floodmagazine.com///
Result:
https://floodmagazine.com/789/foo-bar/
https://floodmagazine.com/12345/foo-bar-1/

这不像搜索 sub-domain (api.floodmagazine.com) 那样容易,因为数据库中有 URL 需要 sub-domain保持(例如图像)。因此 /{number/{string}/ 部分是仅查找需要更改的 URL 的重要方法。

我只需要正则表达式部分,我正在使用 WP Migrate 作为数据库更新部分。

感谢您的帮助!

这应该会获取您描述的所有 URL:

(https://floodmagazine.com)(\/)[0-9]*(\/)[A-z-0-9]*(\/)

https:\/\/api.floodmagazine.com\/([0-9]+)\/([A-z0-9._+-]+)\/? 那应该工作。在 regex101 上你必须转义 / 所以我把它留在这里。在您的工具中可能并非如此。

如果您不想尾部斜线是可选的,您可以省略最后一个 ?

为避免 URL 由于 WordPress 不一致而导致的错误,您可以使用此 PHP 由 regex101

生成的代码
$re = '/https?:\/\/([^\/]+)\/([^\/]+)\/([^\/]+)\/?/m';
$str = 'https://api.floodmagazine.com/789/foo-bar/';
$subst = 'https://floodmagazine.com///';

$result = preg_replace($re, $subst, $str);

此正则表达式捕获域、ID 和 post 名称。可以捕获特殊情况,如非 HTTPS、特殊字符 ... 并且 return 结果与您的示例中预期的一样