TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen 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から再スタートする方法を考えなくてはなりませんでした。ここでは、分かりやすく、クローバル変数を使いました。


前のページ     1    2    3    4    5    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.