Open Source Web Development Tutorials - Dev Shed
preg_replace_callback()関数を使いこなす!
(2009/02/05公開)
preg_replace_callback()を使ってRun中シーケンスを生成する
もっと面白い例として、Run中シーケンスを伴った正規表現でpreg_replaceを使ってみましょう。
さて、以下のように、HTML形式の順序付きリストがあります。
list 1
<ol>
<li>item A</li>
<li>item B</li>
<li>item C</li>
</ol>
これを、Run中シーケンスのプレーンテキスト形式に変換します。
list 1
1. item A
2. item B
3. item C
preg_replace_callback()を使ったコードは、以下のとおりです。
<?php
$str = "list 1
<ol>
<li>item A</li>
<li>item B</li>
<li>item C</li>
</ol>
";
echo preg_replace_callback('%<ol>(.*)</ol>%si', 'process_list', $str);
function process_list($matches) {
return preg_replace_callback("/<li>(.*)</li>/i", 'process_item', trim($matches[1]));
}
function process_item($matches) {
static $sno=0;
++$sno;
return "$sno. $matches[1]";
}
?>
2つのpreg_replace_callback()関数を使っている点に注意してください。最初のpreg_replace_callback()関数で、<ol>タグと</ol>タグ内にあるすべてのアイテムを捕捉します。2番目のpreg_replace_callback()関数で個別のアイテムを処理し、その前にRun中連番を加えます。
以下のように、複数のリストがある場合は、
list 1
<ol>
<li>item A</li>
<li>item B</li>
<li>item C</li>
</ol>
list 2
<ol>
<li>item D</li>
<li>item E</li>
<li>item F</li>
<li>item G</li>
</ol>
list 3
<ol>
<li>item H</li>
<li>item I</li>
<li>item J</li>
<li>item K</li>
<li>item L</li>
</ol>
コードを若干変更する必要があります。
<?php
$str = "
list 1
<ol>
<li>item A</li>
<li>item B</li>
<li>item C</li>
</ol>
list 2
<ol>
<li>item D</li>
<li>item E</li>
<li>item F</li>
<li>item G</li>
</ol>
list 3
<ol>
<li>item H</li>
<li>item I</li>
<li>item J</li>
<li>item K</li>
<li>item L</li>
</ol>
";
echo preg_replace_callback('%<ol>(.*?)</ol>%si', 'process_list', $str);
function process_list($matches) {
global $sno;
$sno = 0;
return preg_replace_callback("/<li>(.*?)</li>/i", 'process_item', trim($matches[1]));
}
function process_item($matches) {
global $sno;
++$sno;
return "$sno. $matches[1]";
}
?>
2つの主な変更に気付きましたか?1つ目は、各リストが1つの単位の状態を保つように、非貪欲(どんよく)(non greedy)な量指定子‘*?’を使用しました。2つ目は、各新規リストに対して、連番を1から再スタートする方法を考えなくてはなりませんでした。ここでは、分かりやすく、クローバル変数を使いました。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








