正規表現(文字の装飾)

メモ:  Category:php

投稿する文章にもう少し変化をつけたいと思います。

文字色の指定と文字サイズの指定をできるようにします。

そこで、代理タグとして[color=red]や[size=10]を使用することとします。前回、[b]や[i]を置き換える場合、単純に文字を置き換えればよかったのですが、今回は、redや10といった要素はそのまま残してそれ以外の部分をHTMLタグとして置き換える必要があります。

ここで登場するのが、正規表現関数です。phpのHELPを見てみるとPerl互換の正規表現関数というのがあります。今回は、この関数のなかのpreg_replaceを使ってみます。(phpには2種類の正規表現が用意されています。Perl互換とPOSIX準拠です。)

正規表現とは

Wikipediaに「正規表現とは、文字列の集合を一つの形式で表現する方法のこと。正則表現(せいそくひょうげん)とも呼ばれる。

パターンマッチ文字列を表すためによく使用される。パターンマッチとは、データを検索する場合に、特定のパターンが出現するかどうか、またどこに出現するかを特定する手法のことである。」とあります。

正規表現を使って定義したパターンにマッチする文字を検索したり、指定した文字列に置き換えたりします。

正規表現の書式

/パターン文字列/パターン修飾子

パターン修飾子を設定すると検索や置き換えの条件を設定できます。
例えば、英字の大文字小文字を無視するとか。

まず、簡単な文字サイズから置き換えてみます。

文字サイズの正規表現

/\[size=([1-2]?[0-9])\]/si

\[は、正規表現で[が文字クラスの開始と定義されているのでエスケープします。
[size=にマッチする。
[1-2]の部分は、1から2の数字にマッチする。つづく?は、0または1回の繰り返しで 文字サイズの10の位が無しか1又は2ということになります。
[0-9]は、1の位が0から9にマッチする。
()は、サブパターンの開始と終了です。サブパターンは置換えの時使用されます。
\]にマッチする。

上記書式ではこのように処理されます。

修飾子のsは改行も含んでマッチします。iは、大文字にも小文字にもマッチします。

文字サイズの正規表現で置き換え

preg_replace("/\[size=([1-2]?[0-9])\]/si","<span style="font-size: $1px">",対象文字列)

正規表現の置換関数では、()サブパターンで囲った部分が$nに置き換えられてマッチした文字列を置き換えます。(php4.0.4より古いものは\\nを使用します。4.0.4移行でも使用可能ですが・・・)

上記書式で、[size=10]がに置き換わります。

サブパターンは、左から右に番号がふられます。$nのnは、0から99までとすることができ0は、パターン全体にマッチする文字列を参照します。

置き換える文字の中で$nのあとに数字が続くような場合、例えば$1で参照するとします。

preg_replace(/\[size=([1-2]?[0-9])\]/si,"<span name=\"$11\">",対象文字列)

などとすると11番目とも取れます。そこでこのような場合、nを{}で囲います。

preg_replace(/\[size=([1-2]?[0-9])\]/si,"<span name=\"${1}1\">",対象文字列)

これで意図した結果となります。

次に文字色を置き換えます。文字色は、色名又はRGBの16進数どちらでも可能とします。

例えば、[color=Navy]又は[color=#000080]となります。

この「又は」という部分はどう表現するのでしょうか?

文字色の正規表現で置き換え

preg_replace("/\[color=(#[0-9A-F]{6}|[a-z]+)]/si","<span style=\“color: $1\">”, 対象文字列);

上記例の中で新しく出てきたのは{6}と | 、+です。

{6}は、6回を意味します。|は、選択肢で「又は」の部分を示します。

+は、1回以上の繰り返しを意味します。

まだまだ多くのパターン構文や修飾子があります。それは、おいおいでてくるのかな?(笑)

bluenote by BBB