2016-08-05 21 views
0

MySQLベースのCMSにテーブルがあり、そのフィールドの1つにCMS Webページに表示される記事のテキストが含まれています。MySQLテーブルから複数のHTMLタグを抽出するには

一部の記事には、HTMLの「img」タグの形でテキストに埋め込まれた画像が含まれています。フィールドに含まれるテキストには、1つまたは複数のイメージが存在することがあります。

私がしたいのは、すべての記事のすべての画像のリストを抽出するクエリを作成することです。この希望はもちろん、実際に(ただし、もちろんそれだけで最初の画像を抽出して、私は実際にそれらのすべてを抽出したいと思い、

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です。したがって、フィールドとテーブルの名前です。しかし、これは実際にはDrupalではなくMySQLについての質問です。なぜDrupal Stackexchangeサイトではなく私がここに求めているのですか?

+0

むしろ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

locals()、substring()、または正規表現を使ってHTMLやXMLを解析しようとすると、あなた自身が狂ってしまうでしょう。あなたは、すべてを持っている正規表現でHTMLを解析

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

それはうまく動作し、Drupalの開発者向けリファレンスでは、[Views PHP module](https://www.drupal。org/project/views_php)を使用して、[このドキュメントで説明されているように]ビューで適切な出力を生成します(https://www.drupal.org/node/2088039) –

0

は100%、あなたが自信を持って感じることは決してないだろうことはありません:

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

出力:私はあなたがPHPのDOMDocumentクラスを使用することをお勧めhttps://blog.codinghorror.com/parsing-html-the-cthulhu-way/

を参照してください。イメージが正しくフォーマットされている、

あなたが持っている他の問題は、あなたの質問で示唆したものです。 node_revisionsには、1または2または10,000個のイメージを含むレコードが1つあります。 SQLには、クエリ結果の新しい行として各イメージを返すことができないため、各イメージを新しい列として返す必要があります。あなたはそこだけ記事ごとの20枚の画像は言う、より少ないだろうし、あなたがPHP/Javaの/のpythonを持っていませんでした知っていた場合は

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 

:あなたは文字通り手動手で各列を指定する必要があります意味

あなたの処分で、それはちょうどあなたが正規表現とSQLでそれを行うことができたが、あなたの30分の仕事は、2日間の仕事とバースト静脈になる可能性があります必要なハックの仕事だった。 Javaはオプションである場合

https://jsoup.org/

Pythonはオプションの場合: https://docs.python.org/2/library/htmlparser.html

PHPがオプションの場合:私は、PHPのようなものでこれをやってお勧め http://htmlparsing.com/php.html

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