美好的一天,
我在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脚本解析结果会更容易吗?
总是赞赏任何和所有帮助。
亲切的问候, 西蒙
答案 0 :(得分:0)
试试这个正则表达式:
::image-gallery::\s+::title::(.*?)::/title::.*?::gallery-entry::(.*?)::/gallery-entry::\s+::/image-gallery::
答案 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::