正規表現(文字の装飾)
投稿する文章にもう少し変化をつけたいと思います。
文字色の指定と文字サイズの指定をできるようにします。
そこで、代理タグとして[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回以上の繰り返しを意味します。
まだまだ多くのパターン構文や修飾子があります。それは、おいおいでてくるのかな?(笑)