重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Postgres 8.3.9を使用しています。

現在使用しているテーブルの中に
HTMLソースを格納しているカラムがあります。
テーブル名:contents
カラム名:text
※データ例:<a href="http://www.google.co.jp">グーグル</a>

HTMLソースが格納されたカラムに対して、キーワードでの検索を行いたいと考えています。

当然ながら以下の様に検索をすると、HTMLソース(例:href)をキーワードとしても検索に引っかかってしまいます。
select * from contents where text Like '%【検索キーワード】%';

なんとか、HTMLソースをキーワードとした場合は検索されずに、
HTMLタグに囲まれた部分(※上記データだと'グーグル')をキーワードとした場合にだけ、
検索されるようにしたいと考えています。

何か良い手法はないでしょうか。
ご教授をお願い致します。

A 回答 (2件)

演算子~*の~は正規表現に一致する検索、


*は大文字小文字を区別しないという意味
です。
正規表現'.*>[^<]*★.*<.*'について
始めの".*"は任意の文字列を示します。
"."は任意の文字、"*"は0回以上の一致を
表わします。次の">"はタグの終わりを表す
文字です。次の"[^<]*"は"<"でない文字が
0回以上("*"です)続くことを示します。
"[]"はグループ化、"^"は否定を意味します。
例えば[^0-9]は「数字ではない」ということ。
'.*>[^<]*'は'~>~'ということです。
この後にキーワードが続きます。
★の後の'.*<.*'はもうお分かりですね。
'~<~'ということです。この記述は
">"と"<"の間にあるキーワードを探すことに
なります。但し、<xxx y="aa>bb" z="★">の
ようなタグがあると、誤認します。">"が
引用符の中かどうか分かりませんからね。

気をつけていただきたいのはキーワードの中に
"."とか"*"のように正規表現上、意味のある
文字を含む場合はエスケープする必要があると
言うことです。

以下を参考にして、試行錯誤してみてください。
http://www.postgresql.jp/document/pg842doc/html/ …

少し前のバージョンでは"+"を正しく解釈して
くれませんでした。現バージョンで直っている
かどうかは不明です。
    • good
    • 0
この回答へのお礼

なるほどです。
ご丁寧に説明いただきありがとうございました。
とても勉強になりました。

自分でも頑張ってみます。

本当にありがとうございました。

お礼日時:2010/02/04 18:49

意味が良く分かりません。


例えば、"href"がキーワードの場合
(1)<a href="http://www.google.co.jp">グーグル</a>
(2)<a href="http://www.google.co.jp">href</a>

(1)はヒットせず、(2)はヒットするということ?

だとすると、こんな感じでしょうか?
select * from where text ~* '.*>[^<]*★.*<.*'
★の所はキーワード

Postgresの場合、正規表現によるマッチング演算子は6個
あるので、Likeよりずっと応用範囲が広い。但し、使い
こなすのは凄く難しい。正規表現がJava等のものと微妙に
異なるし、詳しい説明は何処にもない。
私も「体」で覚えました。いろいろ試してみてください。
サンプルが正しいかどうか分かりませんから・・・

この回答への補足

私の説明が悪かったですね。
すみません。。。。

<a href="​http://www.google.co.jp">​ グーグル</a>

データとして上記の様なHTMLソースがカラムに登録されています。
そのカラムに対してキーワードで検索を行う際、
HTMLタグ部分は検索対象から外したい、という意味です。

上記データの場合、
※"グーグル"というキーワードで検索するとヒットする。
※" href"の様にHTMLタグをキーワードで検索するとヒットしない。

>だとすると、こんな感じでしょうか?
>select * from where text ~* '.*>[^<]*★.*<.*'
>★の所はキーワード
先程、ご教授頂いた正規表現はどのような意味になるのでしょうか。
正規表現の知識が乏しく、私の頭では理解できませんでした。。。
申し訳ございません。
宜しくお願い致します。

補足日時:2010/02/03 18:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!