首页 > 解决方案 > PCRE Regex - 替换序列化字符串中的 URL

问题描述

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

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

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

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

标签: mysqlregexserializationgreppcre

解决方案


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

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

请参阅正则表达式演示

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

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

推荐阅读