« PHP4->5へのドタバタ | トップページ | .で有頂天 »

配列ではなく、正規表現だった

 今取り組んでいる(遊んでいるとも言う)仕事が私の苦手な行列(配列)だ、と昨日書きましたが、よく調べてみると、単にxmlのタグで囲まれた一塊の文字列であることが判明。
 最初の読みが既にずれているという体たらく。
 
 xml自体は一時期興味を持ったことがあって、かなり昔に参考書を購入。 が、基本的にデータベースに興味が無い(だからたまにSQLなんてのを扱う時には非常に辛い)グラフィック上がりの人間には全く面白くありませんでした。
 いや、要するに、任意のタグで囲まれた文字列をhtmlのタグに変換したいだけなんですけど。(すいません、xml専門の方)
 
 見出しとかは単にcssで対応するとして、問題はリンク。
 <url>http://...html</url>
 という文を、
 <a href="http://...html">http://...html</a>
 とする方法に悩みました。
 
 "http://...html"が二度必要で、さらに<>内に入れ子にしなくてはならないので、単純な検索置換では無理。
 夜中の事務所で数時間webをさまよっていると、"preg_replace"という正規表現関数があることを発見。 正規表現は頭の中にあったものの、まさかここまでできるとは...
 要するに特定のパターンに挟まれた間の文字列を一時的な変数に入れておいて、それを残しつつ前後を置換できるのです。
 
 上の<url>http://...html</url>を例に簡単に説明すると、
 $str = preg_replace ('(<url>((http|https)://[0-9A-Za-z-/.~_]+)</url>)', '<a href="$1">$1</a>', $str );
 です。
 
 サイト上の情報では最後の方の"$n"が"¥¥n"で、これがPHP4.4.4では"$n"でないと動かなかったり、デリミタを使えとか(これも¥(バックスラッシュ)自体がタグに使われているので()で代用しないといけない)、なにより、$n(一時的な文字変数)のnが何で決まるのか(正規表現中の左から数えた括弧の順番だそうな:上の例では見かけ上最初の括弧に見えるのは、デリミタとしての括弧ですからご注意を)は単なる推測から探り当てるなど、一筋縄では行きませんでした。
 
 途中で、これはやっぱりPHPのバージョンを上げてライブラリを使わないと無理かな、と諦めかけたけど、いや、絶対力業でなんとかなるはず、と粘った甲斐がありました。
 これが見つかった以上、xmlのタグで囲まれた部分をどんどん一般的なhtmlタグに置き換えることが可能なわけで、あとは鼻歌ペースで行ける...、と思いますが、さて?

※上記、<>を文字として現すためにあえて全角表示にしてあります。

|

« PHP4->5へのドタバタ | トップページ | .で有頂天 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« PHP4->5へのドタバタ | トップページ | .で有頂天 »