ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:gellan カラム内のHTMLタグ除去
困り度:
  • 困っています
MySQL5.1.30をActivePerl5.8.8で動かしています。
noteテーブルにはid、date、name、messageの4つのカラムがあり、
idはオートインクリメント、messageはtext型です。

各レコードのmessageの文字数を数えたいのですが、
messageにはHTMLタグが含まれているレコードもあり、
純粋な文字数を数えるためには、HTMLタグを削除または置換する必要があります。
MySQLのtrim関数やreplace関数に関して色々調べてみましたが、
どうやらこの二つの関数は正規表現には対応していないことがわかりました。

仕方ないので、HTMLタグの除去だけPerlで処理することにしました。
各レコードのidとmessageを取り出し、Perlの文字列置換にてmessageのHTMLタグをすべて除去した後、
keyをid、valueをmessageとして%mes_lenに格納しました。

その後、
$sth = $dbh -> prepare ("select date, name, character_length(\'$mes_len{id}\') as len1 from note order by len1 desc");
として全レコードを表示させると、
以下のようにdate、nameはちゃんと表示されますが、len1はすべて0となってしまいます。
-------------------------
date | name | len1
2009-10-01 | A | 0
2009-10-02 | A | 0
2009-10-03 | A | 0
2009-10-04 | B | 0
(以下最終レコードまで)
-------------------------
どうやら $mes_len{id} のid部分がカラムとして認識されていないようです。

試しにid部分に数字を当てはめて、
$sth = $dbh -> prepare ("select date, name, character_length(\'$mes_len{153}\') as len1 from note order by len1 desc");
などとしてみると、
-------------------------
date | name | len1
2009-10-01 | A | 250
2009-10-02 | A | 250
2009-10-03 | A | 250
2009-10-04 | B | 250
(以下最終レコードまで)
-------------------------
という風に、idが153に該当するレコードのmessage内にある純粋な文字数250が表示されます。

ハッシュ部分の記述を色々変えて試してみましたが、どうも上手く行きません。
id部分をカラムとして認識させる記述方法があればぜひ教えて下さい。

また、本当はPerlのHTMLタグ除去を間に挟まずに、
MySQLだけで上記処理がすべて行えれば理想的なのですが、
自分には見つけられませんでした。
もし、何か上手い方法をご存知の方がおられればアドバイス願います。

宜しくお願いします
質問投稿日時:09/11/05 22:23
質問番号:5424942