【问题标题】:Extracting MySQL data within "tags" using regular expressions? [duplicate]使用正则表达式在“标签”中提取 MySQL 数据? [复制]
【发布时间】:2026-01-27 15:30:01
【问题描述】:

可能重复:
Simulating regex capture groups in mysql

早安,

我有很多行数据存储在 MySQL 表中。典型值可能如下所示:

::image-gallery::
::gallery-entry::images/01.jpg::/gallery-entry::
::/image-gallery::

有没有办法 - 通过正则表达式,我可以 a) 从第一行提取术语图像库(它可以是任何短语,而不仅仅是图像库),然后将中心线提取为两个 单独的值:

gallery-entry,然后是 images/01.jpg

可能有很多行 ::gallery-entry:: 值,它们也可以被称为任何东西。一个更完整的例子是:

::image-gallery::
::title::MY GALLERY::/title::
::date::2011-05-20::/date::
::gallery-entry::images/01.jpg::/gallery-entry::
::/image-gallery::

本质上我想要这些信息:上述情况下的内容类型(图片库),第一行和最后一行。然后我需要标题作为键值样式对,所以 title 作为键,MY GALLERY 作为值。然后,随后,我也需要此后的所有字段行(图库条目)作为键值对。

这是一个迁移脚本,其中旧系统的数据将被迁移到具有不同语法的新系统。

如果 MySQL select 语句不起作用,使用 PHP 脚本解析结果以进行数据提取会更容易吗?

我们总是感谢任何和所有的帮助。

亲切的问候, 西蒙

【问题讨论】:

  • 这些例子代表表中的一行?我猜想只有 sql 的解决方案很难实现。通过快速查看 MySQL (dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp) 中的正则表达式支持,我认为 php 或您喜欢的任何其他语言将是一种更简单的方法。
  • 您好,您可能需要更具体地了解数据的可能结构:标签是否单独包含多个结果集行('image-gallery')?
  • @paul W - 很抱歉回复延迟。但实际上我最终使用了 PHP 的 preg_match() 函数和一些简单的模式匹配。感谢您的反馈。

标签: mysql regex pattern-matching


【解决方案1】:

试试这个正则表达式:

::image-gallery::\s+::title::(.*?)::/title::.*?::gallery-entry::(.*?)::/gallery-entry::\s+::/image-gallery::
  1. 使用单行模式 (/pattern/s) 所以 .*?咀嚼换行符。
  2. 您的键值对将是: 标题:$1(匹配组 1) 画廊入口:$2(匹配组 2)

【讨论】:

    【解决方案2】:

    simulating-regex-capture-groups-in-mysql 看来,似乎没有一种方法可以轻松地在 mysql 中使用正则表达式捕获组。原因是 MySQL 本身不支持正则表达式中的捕获组。如果您想要该功能,您可以使用像 lib_mysqludf_preg 这样的服务器端扩展来将该功能添加到 MySQL。

    最简单的方法是用SQL提取整列,然后用另一种语言(如php)进行文本匹配。

    在我的测试中,kenbritton 的正则表达式不起作用,但在它的基础上,以下正则表达式对您的测试数据起作用:

    ::image-gallery::\s+::title::(.*?)::\/title::\s+(?:.*\s+)*::gallery-entry::(.*?)::\/gallery-entry::\s+::\/image-gallery::
    

    【讨论】: