仕事と晩飯とその他

日記です。

×preg_matchのパターン修飾子 → mb_eregに変更

会社のWebサイトに読み込む目次データ、スマホに対応したリッチなコンテンツにするために、ちまちま作業を進めているのだが、本日のデータは韓国語と日本語が混ざっていた。本によってフォーマットが違うのも悩みの種だが、今回は割とすんなり情報が整理できた。

で、HTMLだとキレイに表示されるのに、それを別のファイルからfile_get_contentsで読み込むと表示されないという状態に。ファイルサイズが大きいのかとか、そんなこと思って色々やってみるもうまく動かず。今日ほぼ一日かけた作業が無駄になるのかと落ち込んでいたが、気を取り直し、テスト用のスクリプトを書いてステップ毎に検証。PHP正規表現検索関数(preg_match)で引っかかっていることがわかった。

そういえば、マルチバイトの時にうまくいかないとか、そんな話があったような気もするが、他の本の「はじめに」や「目次」で簡体字やハングルが混ざっていても平気だった。しかし、どうやらそこしか問題はないようなので、改めて調べる。そうすると、preg_matchでマルチバイトの正規表現を使う時は「u」というパターン修飾子を指定する必要があるとの記述を発見。uはutf8のu。えー、でも他でうまく動いているのに、と半信半疑で試したみたところ、あっさり解決。なんだ、これだったのか。ということで、今日一日の作業は無駄にならず。よかったよかった。

「はじめに」「目次」「本書の使い方」をどんどんWebに上げているわけだが、毎日何ページも作業をしていると、「あ、これ、前に失敗したな」という経験値が溜まってくる。今さらHTMLやCSSの習熟度を上げてどうするという気もしないでもないが、割と楽しい。なんなんだろうか。

 

翌日追記

などと浮かれていたが、次の日、今度は簡体字の含まれたファイルで正規表現のマッチングに失敗している。パターン修飾子の問題ではないなあ。マルチバイトの時はmb_eregを使うのが正しいのだと知る。mb_ereg_matchもあるが、preg_matchと対応するのはmb_eregのようだ(ややこしい)。

ところが、これがまたうまく動かない。PHPのマニュアルを見てもよくわからない。mb_regex_encodingをUTF-8で指定しても動かない。マニュアルの下に貼られたコメントをよく見ると、どうやら正規パターンの書き方が違うようだ。前後のスラッシュが不要?

簡単なパターンで試してみたら動いた。なるほど、mb_eregの時はpregの時に必要だった前後のスラッシュが不要なのか。わかりにくいなあ。

しかし、ここまでわかってしまえばどうということもない。前後のスラッシュが無い正規表現のパターンを書いて適用。

おお、動いた。

ということで、この二日間で、マルチバイトの正規表現関連は完全解決。

その後、pregとmb_eregでは、対応する正規表現のモジュールそのものが異なるということを発見。pregはPCRE、mb_eregはmbregex、PHPのマニュアルではPCREの正規表現については詳しく説明されているが、mbregexの正規表現については書かれていないそうだ。

うーん、弊社の場合は簡体字繁体字・ハングルはもちろん、タイ文字やアラビア文字も扱うので、要所要所でmb_eregを使う必要がある。

と、思ったら、こんなページを発見。なるほど。諸々納得。