PCRE Regex - 替换序列化字符串中的 URL

PCRE Regex - replacing URLs in serialised strings

我正在将几个站点迁移到不同的 URL,但我注意到数据库中有很多包含 URL 的序列化条目。我想出了一个相对简单的正则表达式来匹配以 URL 开头的字符串,但情况并非总是如此。这是我正在使用的正则表达式。

s:(\d+?):\\"(https?:\/\/)?example\.com

这与以下内容完美匹配: s:15:\"http://example.com\" 但如果它们之间有任何东西则不是:s:15:\"foo bar example.com\" (在这种情况下只是例子) 我尝试在此处添加 .*? 之类的内容以匹配两者之间的字符,但正则表达式捕获了太多内容。

tl;dr 如何停止正则表达式捕获过多。 这是我针对虚拟样本使用的正则表达式。 https://regex101.com/r/3GRdLO/1

除了 s:(\d+):\\" 和模式其余部分之间的转义双引号外,您可以匹配任何文本:

s:(\d+):\\"[^\]*(?:\(?!\")[^\]*)*?(https?:\/\/)?example\.com

参见regex demo

添加的模式是[^\]*(?:\(?!\")[^\]*)*?:

  • [^\]* - \
  • 以外的任何 0+ 个字符
  • (?:\(?!\")[^\]*)*? - 以下序列出现 0+ 次,尽可能少:
    • \ - 反斜杠
    • (?!\") - 后面没有双引号
    • [^\]* - \
    • 以外的任何 0+ 个字符