我在基于MySQL的CMS中有一个表,其中一个字段包含CMS网页中显示的文章文本。
部分文章包含嵌入文本中的图像,格式为HTML' img'标签。该字段中包含的文本中可能有一个或多个图像。
我想要做的是创建一个查询,提取所有文章中所有图像的列表。我设法创建了一些代码如下:
SELECT nid,
substr(body,locate('<img', body),(locate('>',body,locate('<img', body)) - locate('<img', body))) as image,
body FROM `node_revisions` where body like '%<img%'
这似乎工作正常,但当然它只提取第一张图片,我真的想要提取所有这些(事实上,这当然意味着使用循环,但这似乎不可能在MySQL)。
仅供参考,有问题的CMS是Drupal 6,因此是字段和表的名称。但是,这真的是一个关于MySQL而不是Drupal的问题,这就是为什么我在这里不要求在Drupal Stackexchange网站上提问。
答案 0 :(得分:1)
您将疯狂地尝试使用locate(),substring()或正则表达式来解析HTML或XML。见https://blog.codinghorror.com/parsing-html-the-cthulhu-way/
我建议你使用PHP的DOMDocument类:
<?php
$bodyHtml = "now is the time for all <img src='good.jpg'> men to come to the <img src='aid.jpg'> of their country";
$dom = new DOMDocument();
$dom->loadHTML($bodyHtml);
$imgs = $dom->getElementsByTagName("img");
foreach ($imgs as $img) {
print "$img->nodeName\n";
foreach ($img->attributes as $attr) {
print " $attr->name=$attr->value\n";
}
}
输出:
img
src=good.jpg
img
src=aid.jpg
答案 1 :(得分:0)
使用正则表达式解析html绝不是100%,你永远不会对自己拥有所有图像和格式正确感到自信,
你遇到的另一个问题是你在问题中暗示的问题。您在node_revisions中有一条记录可能包含1或2或10,000个图像。 在SQL中,您无法将每个图像作为查询结果中的新行返回,因此您必须将每个图像作为新列返回。
意味着你手动需要手动指定每一列:
SELECT code_to_return_img_1 as url1
,code_to_return_img_2 as url2
,code_to_return_img_3 as url3
,code_to_return_img_4 as url4
,code_to_return_img_5 as url5
,code_to_return_img_6 as url6
....
and so on
如果你知道每篇文章只会少于20张图片而且你没有php / java / python可供你使用,那只是你需要的一次性黑客工作那么你可以用正则表达式做到这一点和SQL,但你的30分钟工作可能会变成一个2天的工作和一阵冲动。
如果Java是一个选项: https://jsoup.org/
如果Python是一个选项: https://docs.python.org/2/library/htmlparser.html
如果PHP是一个选项: http://htmlparsing.com/php.html
$dom = new DOMDocument;
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$imgurl = $image->getAttribute('src');
}