mysql - 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
解决方案
您可以匹配除转义双引号之外的任何文本s:(\d+):\\\"
以及模式的其余部分:
s:(\d+):\\\"[^\\]*(?:\\(?!\")[^\\]*)*?(https?:\/\/)?example\.com
请参阅正则表达式演示。
添加的模式是[^\\]*(?:\\(?!\")[^\\]*)*?
:
[^\\]*
- 除了任何 0+ 字符\
(?:\\(?!\")[^\\]*)*?
- 0+ 次出现,尽可能少,以下序列:\\
- 反斜杠(?!\")
- 后面没有双引号[^\\]*
- 除了任何 0+ 字符\
推荐阅读
- composer-php - 如何让 composer.json 脚本接受标志
- python - 为 mathplotlib.pyplot 直方图指定 x 轴上的值
- css - 在撰写新电子邮件时自定义电子邮件背景
- javascript - 将模态表单重定向到我的 php 脚本
- jquery - 如何将 Ajax Json 中的多个复选框值提交到 Flask?
- google-bigquery - 无法查询完整数据集
- ruby-on-rails - 设计重定向错误:“过滤器链因 :check_user 呈现或重定向而停止”
- linux - Bash 中意外标记“elif”附近的语法错误
- c# - C# - 等待多个文件下载完成
- styled-components - 如何使用样式组件有条件地制作动画