我有一个带有Doc TEXT列的mysql表。
该列包含HTML作为内容。
我想选择带过滤的列,以便只从内容中获取网址。列内容包含A HREF ="(。*)" 。
我尝试了mysql的REGEXP,但它只返回true或false,而不是过滤后的匹配。
非常感谢您的帮助。
答案 0 :(得分:1)
如果你的HTML列文本是定义良好的XML(即带有正确结束标记的XHTML),你可以使用MySQL的extractValue()
函数使用Xpath将其解析为XML。
CREATE TABLE links (anchor VARCHAR(100) NOT NULL);
INSERT INTO links VALUES ('<a href="http://stackoverflow.com/">Stack Overflow</a>');
SELECT extractValue(anchor, '/a/@href') FROM links; -- prints http://stackoverflow.com/
如果列包含其他标记(如<body>
等),则只需相应修改X路径(//body/a/@href
)。
编辑:对于以下评论中分享的HTML列:
<HTML><HEAD><TITLE>*******</TITLE></HEAD><BODY><P><A HREF="http://www.google.com">GOOGLE</A></P><div><A HREF="http://www.yahoo.com">YAHOO</A></DIV><TABLE><TR><TD><A HREF="http://www.bing.com">BING</A></TD></TR></TABLE></BODY></HTML>
extractValue()
xpath需要修改为//A/@HREF
(区分大小写)
SELECT extractValue(anchor, '//A/@HREF') FROM links;
-- prints http://www.google.com http://www.yahoo.com http://www.bing.com
另外,请注意,使用<div>
关闭</DIV>
不是正确的XML,但MySQL忽略了它。
答案 1 :(得分:0)
根据@Barmar的建议,我在google搜索并获得了1个解决方案。
用于PREG的用户定义函数。(Perl兼容正则表达式)
http://www.mysqludf.org/
https://github.com/mysqludf/lib_mysqludf_preg#readme
所有函数似乎都很好,我们可以像任何其他语言一样应用正则表达式(Perl,PHP等)
注意:但它需要,c ++程序编译和安装到mysql