使用正则表达式在“标签”中提取MySQL数据?

时间:2011-05-20 11:05:48

标签: mysql regex pattern-matching

  

可能重复:
  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::

本质上我想要这个信息:上面例子中的内容类型(图片库),第一行和最后一行。然后我需要标题作为键值样式对,因此标题作为键, MY GALLERY 作为值。然后,随后,我将需要所有行的字段(gallery-entry)作为键值对。

这适用于迁移脚本,其中旧系统的数据将迁移到具有不同语法的新系统。

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

总是赞赏任何和所有帮助。

亲切的问候, 西蒙

2 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

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

答案 1 :(得分:0)

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::