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+ 个字符
我正在将几个站点迁移到不同的 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+ 个字符