2016-08-05 9 views
0

У меня есть таблица в CMS на основе MySQL, одно из полей которой содержит текст статей, отображаемых на веб-страницах CMS.Как извлечь несколько тегов HTML из таблицы MySQL

Некоторые из статей содержат изображения, встроенные в текст, в виде тегов 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

Я предлагаю делать это с чем-то вроде PHP скорее, MySQL. [Этот ответ] (http://stackoverflow.com/questions/6449072/doing-calculations-in-mysql-vs-php#answer-6449162) может быть информативным. Вот еще одна статья (https://www.quora.com/What-is-faster-for-calculations-in-MySQL-or-PHP). – showdev

ответ

1

Вы будете вести себя безумно, пытаясь использовать locate(), substring() или регулярные выражения для анализа HTML или XML. См https://blog.codinghorror.com/parsing-html-the-cthulhu-way/

Я предлагаю вам использовать РНР 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 
+0

Это работает очень хорошо, и для ссылки разработчика Drupal я смог использовать модуль [Views PHP] (https: //www.drupal.org/project/views_php) для создания соответствующего вывода в представлении [, как описано в этой документации] (https://www.drupal.org/node/2088039) –

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-минутная работа может превратиться в двухдневную работу и всплеск.

Если 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'); 
}