« 尼崎のJR脱線事故 | メイン | マックにTeX環境をインストール »

2005年04月27日(水曜日)

PHP正規表現の謎 [ プログラミング ]

まだWordPressを試行中なのだが,mimeTeXプラグインの改造を試みてみた。mimetexプラグインを使うと [tex] \int_{0}^{\infty} e^{-x^2}\,dx = \frac{\sqrt\pi}{2} [/tex] のように LaTeX に準拠した形で数式が書ける。しかし,それならば,いっそのこと LaTeXそのままに,数式を $... $ とダラーで囲む方がずっと便利だ。ということで,mimetex.php を読んでみた。

自慢じゃないが PHP というプログラム言語はまったく知らない(笑)。しかし,ソースを読むと,やっていることは意外と単純なように思える。まず,記事全体は $text という変数に入っている。これに対して,次のような操作を施している。

preg_match_all("#\[tex\](.*?)\[/tex\]#si",$text,$tex_matches);

PHPのマニュアルその他をネットで調べてみると,どうやら上のコードによって, [tex] 数式 [/tex] というパターンをすべて探し出して,数式の部分を $tex_matches という配列に代入しているらしい。そのあとを読むと,順に mimetex.cgi に数式を渡して,画像に変換させ,その画像を当該部分に差し込むという処理をしている。

上のコードを修正して,[tex]...[/tex] の代わりに $...$ というパターンを探し出すようにできれば,最初の目的は達成される。あくまでも最初の,ではあるが。

さて正規表現だが,この場合は簡単だ。上で # とあるのは,単なるデリミターにすぎない。[ と ] はメタ文字なので,バックスラッシュでエスケープしてあるのがわかる。$ もメタ文字だから,同様にエスケープすればよいだろう。こう考えて,次のように変更してみた。

preg_match_all("#\$(.*?)\$#si",$text,$tex_matches);

これが,まったく機能しない。しないどころか,PHPがエラーを吐く。うーむ・・・。あれこれ調べても分からない。試しに,@...@ではさむことにして,

preg_match_all("#@(.*?)@#si",$text,$tex_matches);

と変更すると,ちゃんと機能する。たしかに方針は間違っていない。ダラーがちゃんとエスケープされてないのが問題だ。

ふと,以前 Emacs LISP か何かで,バックスラッシュをエスケープするのに \\ では駄目で, \\\\ としなくてはならない,という話を思い出した。その理由も理解していないのだったが(苦笑),駄目もとで次のようにしてみた。たしか,バックスラッシュのエスケープを2段階行うということだったと思うので・・・

preg_match_all("#\\\$(.*?)\\\$#si",$text,$tex_matches);

これが,何故か動く(笑)。あはは。どうしてなの?どうして,これで機能するのか,誰か教えてくれないだろうか。


投稿者 sukarabe : 2005年04月27日 19:28

トラックバック

このエントリーのトラックバックURL:
http://njet.oops.jp/cgi/mt/mt-tb-alt.cgi/659

このリストは、次のエントリーを参照しています: PHP正規表現の謎:

» 正規表現で年月日を分解する from ぱふぅ家のホームページ
正規表現を用いて、西暦年月日を表す様々な書式から年月日を分解する方法を紹介する。≫デザインを一新しました。記述ミスを訂正しました。 [続きを読む]

トラックバック時刻: 2008年11月02日 10:41

» 正規表現で画像ファイルのURLを取り出す from ぱふぅ家のホームページ
正規表現を用いて、ネット上のコンテンツから画像ファイルのURLを取り出す方法を紹介する。≫デザインを一新しました。 [続きを読む]

トラックバック時刻: 2009年02月05日 18:50

コメント

コメントしてください

comment spam対策のため,名前とメールの入力が必須になっていますが,メールアドレスは公開されません。Web SiteのURLは任意です。Type Key IDをお持ちの方はType Keyをサイン・インしてくださってもいいです。





次回の入力を省くために、名前・URLなどを保存しますか?