正規表現 - 文字の装飾

投稿する文章にもう少し変化をつけたいと思います。
文字色の指定と文字サイズの指定をできるようにします。
そこで、代理タグとして[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]が<span style="font-size: 10px">に置き換わります。

サブパターンは、左から右に番号がふられます。$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回以上の繰り返しを意味します。

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