我有一个带有 Doc TEXT 列的 mysql 表。
该列包含 HTML 作为内容。
我想选择带有过滤的列以仅从内容中获取 URL。列内容包含 A HREF="(.*)" 。
我尝试了mysql的REGEXP,但它只会返回true或false,而不是过滤后的匹配。
非常感谢您的帮助。
如果您的 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>
等),只需相应地修改您的 Xpath ( //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>
with</DIV>
不是正确的 XML,但不知何故 MySQL 忽略了它。
根据@Barmar 的建议,我在谷歌搜索并得到了 1 个解决方案。
PREG 的用户定义函数。(Perl 兼容正则表达式)
http://www.mysqludf.org/
https://github.com/mysqludf/lib_mysqludf_preg#readme
所有函数看起来都不错,我们可以像使用任何其他语言一样应用正则表达式(Perl、PHP 等)
注意:但它需要 c++ 程序编译和安装到 mysql