2016-08-05 31 views
0

Ich habe eine Tabelle in einem MySQL-basierten CMS, dessen Felder den Text von Artikeln enthalten, die auf den CMS-Webseiten angezeigt werden.Wie kann ich mehrere HTML-Tags aus einer MySQL-Tabelle extrahieren?

Einige der Artikel enthalten Bilder eingebettet in den Text in Form von HTML-Tags 'img'. Es kann ein oder mehrere Bilder in dem Text geben, der in dem Feld enthalten ist.

Was ich tun möchte, ist eine Abfrage erstellen, die eine Liste aller Bilder in allen Artikeln extrahiert. Ich haben es geschafft, einen Code zu erstellen, wie folgt:

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%' 

und dies scheint in Ordnung zu arbeiten, aber natürlich ist es extrahiert nur das erste Bild, und ich würde wirklich alle von ihnen extrahieren möchte (in der Tat natürlich würde dies Im Allgemeinen bedeutet das Verwenden einer Schleife, aber das scheint in MySQL nicht möglich zu sein.

Nur als Referenz ist das CMS in Frage Drupal 6, daher die Namen der Felder und Tabelle. Dies ist jedoch wirklich eine Frage zu MySQL nicht Drupal, weshalb ich hier nicht auf der Drupal Stackexchange Seite frage.

+0

ich mit so etwas wie PHP tun dies empfehlen eher das MySQL. [Diese Antwort] (http://stackoverflow.com/questions/6449072/doing-calculations-in-mysql-vs-php#answer-6449162) könnte informativ sein. Hier ist [ein anderer Artikel] (https://www.quora.com/What-is-faster-for-calculations-in-MySQL-o--PHP). – showdev

Antwort

1

Sie werden verrückt machen, wenn Sie locate(), substring() oder reguläre Ausdrücke verwenden, um HTML oder XML zu analysieren. Siehe https://blog.codinghorror.com/parsing-html-the-cthulhu-way/

Ich schlage vor, Sie PHP verwenden DOMDocument Klasse:

<?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"; 
     } 
} 

Ausgänge:

img 
    src=good.jpg 
img 
    src=aid.jpg 
+0

Das funktioniert ganz gut, und für Drupal Entwickler Referenz konnte ich das [Views PHP Modul] (https: //www.drupal.org/project/views_php), um die entsprechende Ausgabe in einer Ansicht zu erzeugen, [wie in dieser Dokumentation beschrieben] (https://www.drupal.org/node/2088039) –

0

Parsen html mit regex ist nie 100%, werden Sie nie sicher sein, Sie haben jeder bekam Bild und korrekt formatiert,

Das andere Problem, das Sie haben, ist eine, die Sie in Ihrer Frage angedeutet haben. Sie haben einen Datensatz in node_revisions, der 1, 2 oder 10.000 Bilder enthalten kann. Es gibt in SQL keine Möglichkeit, jedes Bild als neue Zeile in den Abfrageergebnissen zurückzugeben, sodass Sie jedes Bild als neue Spalte zurückgeben müssen.

Das heißt, Sie würden buchstäblich manuell jede Spalte von Hand angeben müssen:

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 

Wenn Sie es nur weniger wusste, dass als, sagen wir 20 Bilder pro Artikel und Sie haben nicht PHP/Java/Python zu Ihrer Verfügung, und es war nur ein einmaliger Hack-Job, den Sie brauchten, dann könnten Sie es mit Regex und SQL machen, aber Ihr 30-Minuten-Job könnte zu einem 2-Tage-Job und einer Burst-Ader werden.

Wenn Java ist eine Option: https://jsoup.org/

Wenn Python eine Option ist: https://docs.python.org/2/library/htmlparser.html

Wenn PHP eine Option ist: http://htmlparsing.com/php.html

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    $imgurl = $image->getAttribute('src'); 
}